众所周知,当连接的一侧崩溃时,无法检测到连接丢失。您必须在 TCP 级别或应用程序协议(protocol)级别的两端设置 keepalive。
引用资料:
但是,如果对等点在同一台 Linux 机器上,并且其中一个出现段错误,另一个会不会仅通过在下一个读取调用时收到错误来检测到这种情况?
所有的描述符都是关闭的,对吧?那不应该正确关闭连接吗? (如果网络出现故障,那是内核错误,无论如何每个人都注定要失败)
我正在尝试获得 FIFO 的这一优良特性:当您关闭一端时,另一端会收到一个错误/信号。
最佳答案
如果进程崩溃,操作系统总是关闭其描述符并发送 FIN 以建立 TCP 连接。如果与远程对等点建立通信,则在未发送或未传递 FIN 时会出现操作系统崩溃或网络等很多情况,因此需要保持事件机制。
在同一台机器上的对等点之间建立连接的情况下,如何在不通知另一个对等点的情况下杀死一个通信对等点的可能性较小,但这种可能性仍然存在。例如防火墙可能会丢弃 FIN 数据包:
$ telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
另一个终端:
# iptables -A INPUT -p tcp --sport 23 -j DROP
# iptables -A INPUT -p tcp --sport 23 -j DROP
# kill -9 7737 # telnet client process
瞧 - telnet 服务器不知道客户端已终止。
嗯,这是一个非常模糊的情况,您可能会说它从未在您的环境中发生过。但是执行keep-alive检查只是为了解决一个晦涩难懂的状态。
关于c++ - localhost 套接字是否需要任何类型的 keepalive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30943686/