From 76a5b21c3a319ae1ba4ef8f4f12207a813e43b51 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 8 Feb 2013 17:06:01 +0100 Subject: [PATCH] Tcp keep-alive: send three probes before detectin an error. Otherwise we end with less reliable connections because it's too easy that a single packet gets lost. --- src/anet.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/anet.c b/src/anet.c index 82bca5534..963b6688e 100644 --- a/src/anet.c +++ b/src/anet.c @@ -100,15 +100,19 @@ int anetKeepAlive(char *err, int fd, int interval) return ANET_ERR; } - /* Send next probes after interval. */ - val = interval; + /* Send next probes after the specified interval. Note that we set the + * delay as interval / 3, as we send three probes before detecting + * an error (see the next setsockopt call). */ + val = interval/3; + if (val == 0) val = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) { anetSetError(err, "setsockopt TCP_KEEPINTVL: %s\n", strerror(errno)); return ANET_ERR; } - /* Consider the socket in error state after just one missing ACK reply. */ - val = 1; + /* Consider the socket in error state after three we send three ACK + * probes without getting a reply. */ + val = 3; if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) { anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno)); return ANET_ERR;