diff --git a/lib/std/net.zig b/lib/std/net.zig index 53b75d8578..cd456c46c6 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -1290,6 +1290,9 @@ pub const StreamServer = struct { /// If more than this many connections pool in the kernel, clients will start /// seeing "Connection refused". kernel_backlog: u32 = 128, + + /// Enable SO_REUSEADDR on the socket. + reuse_address: bool = false, }; /// After this call succeeds, resources have been acquired and must @@ -1320,6 +1323,19 @@ pub const StreamServer = struct { self.sockfd = null; } + // TODO proper interface with errors in std.os + var optval: c_int = 1; + + if (self.options.reuse_address) { + _ = os.linux.setsockopt( + server.sockfd.?, + os.linux.SOL_SOCKET, + os.linux.SO_REUSEADDR, + @ptrCast([*]const u8, &optval), + @sizeOf(c_int), + ); + } + var socklen = address.getOsSockLen(); try os.bind(sockfd, &address.any, socklen); try os.listen(sockfd, self.kernel_backlog);