From 631eb6783d1dbc64f031426436ab685008c31ca8 Mon Sep 17 00:00:00 2001 From: Luna Date: Thu, 28 Nov 2019 22:19:42 -0300 Subject: [PATCH] add StreamServer.Options.reuse_address this uses a bad direct interface with std.os.linux, this should add setsockopt to std.os. --- lib/std/net.zig | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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);