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==--