From 199d2cb6c2383fba3879af5e8ee7fd7173da72bd Mon Sep 17 00:00:00 2001 From: socec Date: Sun, 9 Mar 2014 18:48:04 +0100 Subject: [PATCH] stop crashing server when client disconnects --- moxerver.c | 15 +++++++++++++-- moxerver.h | 1 + server.c | 5 +++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/moxerver.c b/moxerver.c index 3fee3de..beb1121 100644 --- a/moxerver.c +++ b/moxerver.c @@ -1,7 +1,7 @@ #include "moxerver.h" -#define SERVER_WAIT_TIMEOUT 10 /* seconds for select() timeout in server loop */ +#define SERVER_WAIT_TIMEOUT 5 /* seconds for select() timeout in server loop */ #define PORT_MIN 4001 /* minimum TCP port number */ #define PORT_MAX 4008 /* maximum TCP port number */ @@ -137,7 +137,18 @@ int main(int argc, char *argv[]) { } } if (ret == 0) { - fprintf(stderr, "server waiting\n"); + /* check if client disconnected */ + /* a disconnected client socket is ready for reading but read returns 0 */ + if ( (client.socket != -1) && FD_ISSET(client.socket, &read_fds) ) { + if (client_read(&client) == 0) { + fprintf(stderr, "client %s disconnected\n", client.ip_string); + /* close client connection */ + client_close(&client); + } + } + else { + fprintf(stderr, "server waiting\n"); + } } } /* END while loop */ diff --git a/moxerver.h b/moxerver.h index 7b6c604..7275df2 100644 --- a/moxerver.h +++ b/moxerver.h @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include diff --git a/server.c b/server.c index deb1f5c..881c00e 100644 --- a/server.c +++ b/server.c @@ -85,6 +85,11 @@ int server_accept(struct server_t *server, struct client_t *accepted_client) { fprintf(stderr, "[%s:%d] error %d: %s\n", __func__, __LINE__, errno, strerror(errno)); return -errno; } + /* make client socket non-blocking */ + if (fcntl(accepted_client->socket, F_SETFL, O_NONBLOCK) == -1) { + fprintf(stderr, "[%s:%d] error %d: %s\n", __func__, __LINE__, errno, strerror(errno)); + return -errno; + } /* get client IP address as human readable string */ inet_ntop(accepted_client->address.sin_family, &accepted_client->address.sin_addr.s_addr,