summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorJohann Latocha2012-01-30 21:57:52 +0100
committerJohann Latocha2012-01-30 21:57:52 +0100
commit83c80e33b2ad1ecc37e5fb637c411fbb33371a81 (patch)
tree3c2cdb691e5febcb7340ada5d38465b3e6e56efe /src/server
parent[SERVER] Some refactoring (diff)
downloaddnbd3-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.c14
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);