diff --git a/reuseport/reuseport.go b/reuseport/reuseport.go index ee33f7d..69d861a 100644 --- a/reuseport/reuseport.go +++ b/reuseport/reuseport.go @@ -72,6 +72,11 @@ func Listen(network, addr string) (l net.Listener, err error) { return nil, &ErrNoReusePort{err} } + if err = setTCPDeferAccept(fd); err != nil { + syscall.Close(fd) + return nil, err + } + if err = syscall.Bind(fd, sockaddr); err != nil { syscall.Close(fd) return nil, err diff --git a/reuseport/reuseport_bsd.go b/reuseport/reuseport_bsd.go index 89b44cb..f9cca96 100644 --- a/reuseport/reuseport_bsd.go +++ b/reuseport/reuseport_bsd.go @@ -2,6 +2,10 @@ package reuseport -import "syscall" - var reusePort = syscall.SO_REUSEPORT + +func setTCPDeferAccept(fd int) error { + // BSD supports similar SO_ACCEPTFILTER option, but I have no access + // to BSD at the moment for proper implementation. + return nil +} diff --git a/reuseport/reuseport_linux.go b/reuseport/reuseport_linux.go index 483aba1..c7f31db 100644 --- a/reuseport/reuseport_linux.go +++ b/reuseport/reuseport_linux.go @@ -1,3 +1,13 @@ +// +build linux + package reuseport +import ( + "syscall" +) + var reusePort = 0x0F + +func setTCPDeferAccept(fd int) error { + return syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.TCP_DEFER_ACCEPT, 2) +}