diff --git a/internal/engine/sockopt_unix.go b/internal/engine/sockopt_unix.go new file mode 100644 index 0000000..7856425 --- /dev/null +++ b/internal/engine/sockopt_unix.go @@ -0,0 +1,9 @@ +//go:build !windows + +package engine + +import "syscall" + +func setReuseAddr(fd uintptr) error { + return syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) +} diff --git a/internal/engine/sockopt_windows.go b/internal/engine/sockopt_windows.go new file mode 100644 index 0000000..dc0aa9d --- /dev/null +++ b/internal/engine/sockopt_windows.go @@ -0,0 +1,9 @@ +//go:build windows + +package engine + +import "syscall" + +func setReuseAddr(fd uintptr) error { + return syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) +} diff --git a/internal/engine/stream_server.go b/internal/engine/stream_server.go index ebd3f67..35bf613 100644 --- a/internal/engine/stream_server.go +++ b/internal/engine/stream_server.go @@ -72,7 +72,7 @@ func (ss *StreamServer) Listen(ctx context.Context) error { lc := net.ListenConfig{ Control: func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { - _ = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + _ = setReuseAddr(fd) }) }, }