Set socket TCP keepalive option on incoming connections

If a connected host disappears without our knowledge, as can happen over
wireless or a hibernating machine, we continue to hold the port open waiting
for messages. Because we never try to send anything down this now-broken
pipe, the connection will sit idle taking up a slot in our allowed incoming
connections list.

If enough of these happen, an unintended Denial of Service takes place,
where all connection slots are filled with now-broken, never ending
connections. Setting the TCP keepalive option at least allows these to time
out after the default two hours, which is sufficient in the non-malicious
case.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee
2011-09-19 08:10:13 -05:00
committed by Max Kellermann
parent 74617389c8
commit 27946a981f
3 changed files with 24 additions and 2 deletions

View File

@@ -148,3 +148,18 @@ socket_bind_listen(int domain, int type, int protocol,
return fd;
}
int
socket_keepalive(int fd)
{
const int reuse = 1;
#ifdef WIN32
const char *optval = (const char *)&reuse;
#else
const void *optval = &reuse;
#endif
return setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
optval, sizeof(reuse));
}