【发布时间】:2014-02-11 14:28:06
【问题描述】:
我有一个使用 TCP 套接字用 C 语言编写的客户端/服务器应用程序。我想知道使用在客户端套接字上启用的 SO_KEEPALIVE 选项的死服务器进程。我正在使用 Linux。
我将默认时间从 2 小时修改为 10 分钟。
echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
我使用 setsockopt() 在客户端套接字上启用了 SO_KEEPALIVE。我在向客户端发送数据时故意杀死(kill -9)服务器进程。
正如预期的那样,在 10 分钟超时(加上额外的探测时间)后,客户端套接字得到通知(读取(scoket,...)返回零)。
然而,令我惊讶的是,即使我在客户端套接字上禁用此选项,它仍然会在指定的超时后收到通知(read() 返回零)。
在 Linux 中是否默认启用此行为?
另外,我觉得 read() 返回零是不合适的,当对等体死亡时 read() 不应该返回一些错误吗?
【问题讨论】:
-
当你杀死一个 Linux 进程(或者进程崩溃)时,所有的套接字都会被彻底关闭,并且与对等方的连接会被重置。如果你想测试真正死掉的客户端,你将不得不对来自服务器的所有流量进行防火墙或拔掉电缆或使内核崩溃。
-
你可以通过getsockopt检查...
标签: linux sockets tcp linux-kernel network-programming