From 4aea807a167a894fd264718efc8c9fa8bced7dcb Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 18 Aug 2025 19:23:28 -0400 Subject: Add socket option for SO_REUSEADDR - Enable it by default in multiplex. - Update deps. Signed-off-by: Andrew Opalach --- src/multiplex.c | 4 +++- src/socket/socket.h | 4 +++- src/socket/socket_internal.h | 1 + src/socket/socket_linux.c | 6 ++++++ src/socket/socket_windows.c | 6 ++++++ 5 files changed, 19 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/multiplex.c b/src/multiplex.c index efce31c..4378884 100644 --- a/src/multiplex.c +++ b/src/multiplex.c @@ -7,7 +7,9 @@ bool nn_multiplex_socket_init(struct nn_multiplex_socket *multi, u8 type, bool (*connection_callback)(void *, u8, struct nn_packet_stream *), void *userdata) { multi->sock.type = type; - if (!nn_socket_init(&multi->sock, NNWT_SOCKET_NONBLOCKING)) { + s32 flags = NNWT_SOCKET_NONBLOCKING; + if (type == NNWT_SOCKET_TCP) flags |= NNWT_SOCKET_REUSE_ADDR; + if (!nn_socket_init(&multi->sock, flags)) { return false; } multi->connection_callback = connection_callback; diff --git a/src/socket/socket.h b/src/socket/socket.h index 5f16ec6..e1b203a 100644 --- a/src/socket/socket.h +++ b/src/socket/socket.h @@ -20,7 +20,8 @@ enum { enum { NNWT_SOCKET_NONBLOCKING = 1, - NNWT_SOCKET_NODELAY = 1 << 1 + NNWT_SOCKET_NODELAY = 1 << 1, + NNWT_SOCKET_REUSE_ADDR = 1 << 2 }; // @TODO: Guard against EINTR? @@ -59,6 +60,7 @@ bool nn_socket_init(struct nn_socket *sock, s32 flags); void nn_socket_set_blocking(struct nn_socket *sock, bool blocking); void nn_socket_set_nodelay(struct nn_socket *sock, s32 nodelay); +void nn_socket_set_reuse_addr(struct nn_socket *sock, s32 reuse_addr); u32 nn_socket_get_send_buf(struct nn_socket *sock); void nn_socket_set_send_buf(struct nn_socket *sock, u32 sndbuf); diff --git a/src/socket/socket_internal.h b/src/socket/socket_internal.h index 41b48ca..7086d39 100644 --- a/src/socket/socket_internal.h +++ b/src/socket/socket_internal.h @@ -16,4 +16,5 @@ static inline void nn_socket_apply_flags(struct nn_socket *sock, s32 flags) { if (flags & NNWT_SOCKET_NONBLOCKING) nn_socket_set_blocking(sock, false); if (flags & NNWT_SOCKET_NODELAY) nn_socket_set_nodelay(sock, 1); + if (flags & NNWT_SOCKET_REUSE_ADDR) nn_socket_set_reuse_addr(sock, 1); } diff --git a/src/socket/socket_linux.c b/src/socket/socket_linux.c index a631348..d854644 100644 --- a/src/socket/socket_linux.c +++ b/src/socket/socket_linux.c @@ -68,6 +68,12 @@ void nn_socket_set_nodelay(struct nn_socket *sock, s32 nodelay) setsockopt(sock->fd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay)); } +void nn_socket_set_reuse_addr(struct nn_socket *sock, s32 reuse_addr) +{ + al_assert(sock->type == NNWT_SOCKET_TCP); + setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr)); +} + u32 nn_socket_get_send_buf(struct nn_socket *sock) { u32 send_queue_size; diff --git a/src/socket/socket_windows.c b/src/socket/socket_windows.c index 370f403..123640e 100644 --- a/src/socket/socket_windows.c +++ b/src/socket/socket_windows.c @@ -39,6 +39,12 @@ void nn_socket_set_nodelay(struct nn_socket *sock, s32 nodelay) (void)nodelay; } +void nn_socket_set_reuse_addr(struct nn_socket *sock, s32 reuse_addr) +{ + (void)sock; + (void)reuse_addr; +} + bool nn_socket_set(struct nn_socket *sock, str *addr, u16 port) { (void)sock; -- cgit v1.2.3-101-g0448