diff options
author | Andy Pan <panjf2000@gmail.com> | 2020-06-04 22:51:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-04 16:51:39 +0200 |
commit | 33b3cb259ef45395d394f2ad8d25872a0205489f (patch) | |
tree | 64498541ad38f59681596a61a5714d0ddd6881f5 /reuseport | |
parent | Update TechEmpower benchmark from 18 to 19 round (#821) (diff) | |
download | fasthttp-33b3cb259ef45395d394f2ad8d25872a0205489f.tar.gz fasthttp-33b3cb259ef45395d394f2ad8d25872a0205489f.tar.bz2 fasthttp-33b3cb259ef45395d394f2ad8d25872a0205489f.zip |
Support Windows SO_REUSEADDR (#822)
* Support Windows SO_REUSEADDR
* Update the comment
* Renew comment of the Listen method on Windows
Diffstat (limited to 'reuseport')
-rw-r--r-- | reuseport/reuseport_test.go | 2 | ||||
-rw-r--r-- | reuseport/reuseport_windows.go | 18 | ||||
-rw-r--r-- | reuseport/reuseport_windows_test.go | 18 |
3 files changed, 15 insertions, 23 deletions
diff --git a/reuseport/reuseport_test.go b/reuseport/reuseport_test.go index 76df6ee..a9b60ea 100644 --- a/reuseport/reuseport_test.go +++ b/reuseport/reuseport_test.go @@ -1,5 +1,3 @@ -// +build !windows - package reuseport import ( diff --git a/reuseport/reuseport_windows.go b/reuseport/reuseport_windows.go index 8137eb5..bf5c312 100644 --- a/reuseport/reuseport_windows.go +++ b/reuseport/reuseport_windows.go @@ -1,11 +1,23 @@ package reuseport import ( - "fmt" + "context" "net" + "syscall" + + "golang.org/x/sys/windows" ) -// Listen always returns ErrNoReusePort on Windows +var listenConfig = net.ListenConfig{ + Control: func(network, address string, c syscall.RawConn) (err error) { + return c.Control(func(fd uintptr) { + err = windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_REUSEADDR, 1) + }) + }, +} + +// Listen returns TCP listener with SO_REUSEADDR option set, SO_REUSEPORT is not supported on Windows, so it uses +// SO_REUSEADDR as an alternative to achieve the same effect. func Listen(network, addr string) (net.Listener, error) { - return nil, &ErrNoReusePort{fmt.Errorf("Not supported on Windows")} + return listenConfig.Listen(context.Background(), network, addr) } diff --git a/reuseport/reuseport_windows_test.go b/reuseport/reuseport_windows_test.go deleted file mode 100644 index 33ac337..0000000 --- a/reuseport/reuseport_windows_test.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build windows - -package reuseport - -import ( - "testing" -) - -func TestListen(t *testing.T) { - _, err := Listen("tcp6", "[::1]:10082") - if err == nil { - t.Fatalf("unexpected non-error creating listener") - } - - if _, errnoreuseport := err.(*ErrNoReusePort); !errnoreuseport { - t.Fatalf("unexpected error creating listener: %s", err) - } -} |