summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/multiplex.c4
-rw-r--r--src/socket/socket.h4
-rw-r--r--src/socket/socket_internal.h1
-rw-r--r--src/socket/socket_linux.c6
-rw-r--r--src/socket/socket_windows.c6
5 files changed, 19 insertions, 2 deletions
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;