diff options
author | Johann Latocha | 2012-01-30 21:57:52 +0100 |
---|---|---|
committer | Johann Latocha | 2012-01-30 21:57:52 +0100 |
commit | 83c80e33b2ad1ecc37e5fb637c411fbb33371a81 (patch) | |
tree | 3c2cdb691e5febcb7340ada5d38465b3e6e56efe /src/server | |
parent | [SERVER] Some refactoring (diff) | |
download | dnbd3-83c80e33b2ad1ecc37e5fb637c411fbb33371a81.tar.gz dnbd3-83c80e33b2ad1ecc37e5fb637c411fbb33371a81.tar.xz dnbd3-83c80e33b2ad1ecc37e5fb637c411fbb33371a81.zip |
[SERVER] Timeout for client sockets
[KERNEL] Send keep alive
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/server.c | 14 |
1 files changed, 14 insertions, 0 deletions
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); |