From 83c80e33b2ad1ecc37e5fb637c411fbb33371a81 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Mon, 30 Jan 2012 21:57:52 +0100 Subject: [SERVER] Timeout for client sockets [KERNEL] Send keep alive --- src/server/server.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/server') diff --git a/src/server/server.c b/src/server/server.c index 33e93f1..ffeb0af 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -108,6 +108,12 @@ void *handle_query(void *client_socket) cmd = request.cmd; switch (cmd) { + case CMD_PING: + reply.cmd = request.cmd; + memcpy(reply.handle, request.handle, sizeof(request.handle)); + send(sock, (char *) &reply, sizeof(struct dnbd3_reply), 0); + break; + case CMD_GET_SIZE: pthread_spin_lock(&spinlock); // because of reloading config image_file = open(dnbd3_ht_search(request.image_id), O_RDONLY); @@ -249,6 +255,11 @@ int main(int argc, char* argv[]) dnbd3_write_pid_file(getpid()); printf("INFO: Server is ready...\n"); + struct timeval timeout; + timeout.tv_sec = SERVER_SOCKET_TIMEOUT; + timeout.tv_usec = 0; + + while (1) { len = sizeof(client); @@ -260,6 +271,9 @@ int main(int argc, char* argv[]) } printf("INFO: Client: %s connected\n", inet_ntoa(client.sin_addr)); + setsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); + setsockopt (fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); + // FIXME: catch SIGKILL/SIGTERM and close all socket before exit pthread_t thread; pthread_create(&(thread), NULL, handle_query, (void *)(uintptr_t) fd); -- cgit v1.2.3-55-g7522