c++ - localhost 套接字是否需要任何类型的 keepalive?

标签 c++ linux sockets tcp

众所周知,当连接的一侧崩溃时,无法检测到连接丢失。您必须在 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/

相关文章:

c - 拔下并重新插入连接器后无法从串行设备读取

linux - 来自 Linux 主机或 Windows 主机的 USB 设置请求不同

java - Java从客户端发送整数到服务器

c++客户端在不同端口上有响应

c++ - 未解析的外部符号 (LNK2019)

c++ - 为什么 RWDBManager::database 需要共享库名?

c++ - 为什么我不能增加简单 constexpr 函数的参数?

c++ - 有效防止重复访问

php - 使用 shell_exec() 运行 shell 脚本时,putenv() 设置的环境变量不存在 | PHP

c - 将多个 IP 地址匹配到一个端点