我有一个使用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()返回零是不合适的,不应该读取()当对等体死了时会返回一些错误吗?
答案 0 :(得分:2)
Keepalive会导致连接重置。导致read()返回零的唯一原因是接收FIN。 Ergo,你收到了FIN,而不是keepalive终止,并且这并没有表明在Linux中默认启用了keepalive。这将违反RFC 1122。