From f576099a00cdf87d2e8931da8ec03e2b27c449a2 Mon Sep 17 00:00:00 2001 From: Test_User Date: Sat, 17 Aug 2024 21:27:02 -0400 Subject: Retry binding for the client socket if EADDRINUSE --- client_network.c | 24 +++++++++++++++++------- main.c | 8 ++++++++ network.h | 2 ++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/client_network.c b/client_network.c index 1ae8fea..0050812 100644 --- a/client_network.c +++ b/client_network.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -535,6 +536,10 @@ int client_mode_handler(uint64_t argc, struct string *argv) { int client_fd = -1; int client_listen_fd; +int client_listen_fd_ready = 0; +struct sockaddr_in client_listen_fd_bind_addr = { + .sin_family = AF_INET, +}; int initclientnetwork(void) { client_network_commands.array = malloc(0); @@ -555,14 +560,19 @@ int initclientnetwork(void) { int one = 1; setsockopt(client_listen_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - struct sockaddr_in localhost = { - .sin_family = AF_INET, - .sin_port = htons(6667), - }; - inet_pton(AF_INET, "127.0.0.1", &localhost.sin_addr); // this is indeed localhost for mine, and I have no intent to change this - bind(client_listen_fd, (struct sockaddr*)&localhost, sizeof(localhost)); + client_listen_fd_bind_addr.sin_port = htons(6667); + + inet_pton(AF_INET, "127.0.0.1", &client_listen_fd_bind_addr.sin_addr); // this is indeed localhost for mine, and I have no intent to change this - listen(client_listen_fd, 1); + if (bind(client_listen_fd, (struct sockaddr*)&client_listen_fd_bind_addr, sizeof(client_listen_fd_bind_addr)) == -1) { + if (errno != EADDRINUSE) { + close(client_listen_fd); + return 1; + } + } else { + listen(client_listen_fd, 1); + client_listen_fd_ready = 1; + } return 0; } diff --git a/main.c b/main.c index e3ba683..1ec66bc 100644 --- a/main.c +++ b/main.c @@ -39,6 +39,14 @@ #include "types.h" void *client_loop(void *ign) { + while (!client_listen_fd_ready) { + if (bind(client_listen_fd, (struct sockaddr *)&client_listen_fd_bind_addr, sizeof(client_listen_fd_bind_addr)) == -1) { + sleep(1); + } else { + client_listen_fd_ready = 1; + } + } + pthread_mutex_lock(&send_lock); while (1) { struct string full_msg = {.data = malloc(0), .len = 0}; diff --git a/network.h b/network.h index a05503e..d9df589 100644 --- a/network.h +++ b/network.h @@ -89,6 +89,8 @@ extern pthread_mutex_t send_lock; extern int client_fd; extern int client_listen_fd; +extern int client_listen_fd_ready; +extern struct sockaddr_in client_listen_fd_bind_addr; extern struct string client_nick; extern uint8_t client_connected; -- cgit v1.2.3