patch to use tcp keepalive

Tilmann Hentze via Slrn-user <[email protected]> Fri, 13 Feb 2026 16:29:11 -0000 (UTC)
Newsgroups gmane.network.slrn.user
Organization ordered
Message-ID <[email protected]>
--===============1808142247650223447==
Content-Type: multipart/signed;              micalg="pgp-sha512";
              protocol="application/pgp-signature";
              boundary="-----
 =_NTBCN0IzNkQ2NkQwN0FFRkYwRUJGM0U5NzQ4MUM1QkM="

------- =_NTBCN0IzNkQ2NkQwN0FFRkYwRUJGM0U5NzQ4MUM1QkM=
MIME-Version: 1.0
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
Content-Type: text/plain;
              charset="UTF-8"
Content-Transfer-Encoding: 8bit

Patch to use tcp keepalive, so the server does not hang up the connection
when being idle. Perhaps it is useful to somebody else.

diff --git a/src/sltcp.c b/src/sltcp.c
index 40ada13..937b441 100644
--- a/src/sltcp.c
+++ b/src/sltcp.c
@@ -78,6 +78,8 @@
 # include <arpa/inet.h>
 #endif
 
+#include <netinet/tcp.h>
+
 #if !defined(h_errno) && !defined(__CYGWIN__)
 extern int h_errno;
 #endif
@@ -201,6 +203,10 @@ static int sys_call_interrupted_hook (void) /*{{{*/
  */
 static int get_tcp_socket_1 (char *host, int port) /*{{{*/
 {
+   int keepalive = 1;
+   int keepidle = 60;
+   int keepcnt = 5;
+   int keepintvl = 5;
 #ifdef HAVE_GETADDRINFO
    /* Be AF-independent, so IPv6 works as well */
    int fd;
@@ -279,6 +285,14 @@ static int get_tcp_socket_1 (char *host, int port) /*{{{*/
 	    print_error ("Error creating socket: %s\n", strerror(errno));
 	 }
       } else {
+	    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive))
+	    || setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle))
+	    || setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt))
+	    || setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl))) {
+           if (TCP_Verbose_Reporting) {
+              print_error ("Error setting socket option: %s\n", strerror(errno));
+           }
+        }
 	 if (TCP_Verbose_Reporting) {
 	    print_error ("Created socket; descriptor is = %i\n", fd);
 	 }
@@ -368,6 +382,10 @@ static int get_tcp_socket_1 (char *host, int port) /*{{{*/
 	perror("socket");
 	return -1;
      }
+   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
+   setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
+   setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt));
+   setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl)));
 
    not_connected = -1;
 

------- =_NTBCN0IzNkQ2NkQwN0FFRkYwRUJGM0U5NzQ4MUM1QkM=
MIME-Version: 1.0
Content-Disposition: attachment
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----

iIsEABYKADMWIQR8dCBKfJM4KiPu/Jxq+QIoQiEKkwUCaY9RURUcMHhjYWZlQGRp
cmVjdGJveC5jb20ACgkQavkCKEIhCpMU4AEAjBdsWL/onPtb1FU7z2rwi+YjZ1N1
+V9+WJ4rursvozoBAKgIY2EnJ9O7l83GGRMq4/Ytb9KbTjOKCGJfavlQg2AG
=TRpl
-----END PGP SIGNATURE-----

------- =_NTBCN0IzNkQ2NkQwN0FFRkYwRUJGM0U5NzQ4MUM1QkM=--



--===============1808142247650223447==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============1808142247650223447==--