src/server/daemon/httplistener.c

changeset 541
1e1fca11aaff
parent 502
11ac3761c0e3
child 554
e0a6b761ddbc
--- a/src/server/daemon/httplistener.c	Sun Aug 11 10:09:20 2024 +0200
+++ b/src/server/daemon/httplistener.c	Sun Aug 11 13:26:17 2024 +0200
@@ -34,6 +34,7 @@
 #include <sys/shm.h>
 #include <sys/ipc.h>
 #include <sys/file.h>
+#include <netinet/tcp.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>
@@ -635,7 +636,12 @@
             }
             continue;
         }
-                 
+        
+        //if(http_listener_apply_keep_alive_settings(listener, clientfd)) {
+        //    close(clientfd);
+        //    continue;
+        //}
+             
         // check listener
         HttpListener *ls = listener;
         int acceptor_exit = 0;
@@ -731,3 +737,33 @@
     // a socket
     ws_atomic_dec32(&ws->ref);
 }
+
+
+int http_listener_apply_keep_alive_settings(HttpListener *listener, int fd) {
+    // TODO: all these values should be configurable
+    int optval = 1;
+    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval))) {
+        log_ereport(LOG_FAILURE, "listener: cannot set SO_KEEPALIVE: %s", strerror(errno));
+        return 1;
+    }
+
+    int keepidle = 60;
+    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle))) {
+        log_ereport(LOG_FAILURE, "listener: cannot set TCP_KEEPIDLE to value %d: %s", keepidle, strerror(errno));
+        return 1;
+    }
+
+    int keepintvl = 10;
+    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl))) {
+        log_ereport(LOG_FAILURE, "listener: cannot set TCP_KEEPINTVL to value %d: %s", keepintvl, strerror(errno));
+        return 1;
+    }
+
+    int keepcnt = 3;
+    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt))) {
+        log_ereport(LOG_FAILURE, "listener: cannot set TCP_KEEPCNT to value %d: %s", keepcnt, strerror(errno));
+        return 1;
+    }
+    
+    return 0;
+}

mercurial