aboutsummaryrefslogtreecommitdiff
path: root/reuseport
diff options
context:
space:
mode:
authorGravatar Andy Pan <panjf2000@gmail.com> 2020-06-04 22:51:39 +0800
committerGravatar GitHub <noreply@github.com> 2020-06-04 16:51:39 +0200
commit33b3cb259ef45395d394f2ad8d25872a0205489f (patch)
tree64498541ad38f59681596a61a5714d0ddd6881f5 /reuseport
parentUpdate TechEmpower benchmark from 18 to 19 round (#821) (diff)
downloadfasthttp-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.go2
-rw-r--r--reuseport/reuseport_windows.go18
-rw-r--r--reuseport/reuseport_windows_test.go18
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)
- }
-}