Linux上默认启用SO_KEEPALIVE行为?

时间:2014-02-11 14:28:06

标签: linux sockets tcp linux-kernel network-programming

我有一个使用TCP套接字用C编写的客户端/服务器应用程序。我想知道在客户端套接字上启用了SO_KEEPALIVE选项的死服务器进程。我正在使用Linux。

我将默认时间从2小时修改为10分钟。

echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time

我使用setsockopt()在客户端套接字上启用了SO_KEEPALIVE。我故意杀死(杀死-9)服务器进程,同时将数据发送给客户端。

正如预期的那样,超过10分钟后(加上探测的额外时间),客户端套接字得到通知(读取(scoket,...)返回零)。

然而,令我惊讶的是,即使我在客户端套接字上禁用此选项,它仍会在指定的超时(read()返回零)后得到通知。

默认情况下在Linux中启用此行为吗?

另外,我觉得read()返回零是不合适的,不应该读取()当对等体死了时会返回一些错误吗?

1 个答案:

答案 0 :(得分:2)

Keepalive会导致连接重置。导致read()返回零的唯一原因是接收FIN。 Ergo,你收到了FIN,而不是keepalive终止,并且这并没有表明在Linux中默认启用了keepalive。这将违反RFC 1122。