diff -r d9c3c23c635b -r 1e1fca11aaff src/server/daemon/httplistener.c --- 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 #include #include +#include #include #include #include @@ -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; +}