在本地主机套接字上是否需要任何类型的保持连接
Is any kind of keepalive necessary on localhost socket?
众所周知,当连接的一端崩溃时,无法检测到连接丢失。您必须在TCP级别或应用程序协议级别的两端设置保持连接。
引用:
- 如何检测TCP套接字断开连接(使用C伯克利套接字)
- 检测 TCP 客户端断开连接
但是,如果对等方在同一台 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 服务器不知道客户端已终止。
好吧,这是非常模糊的条件,您可能会说它永远不会在您的环境中发生。但是,实施保持活动状态检查只是为了解决一个晦涩而奇怪的状态。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 对任何类型的元素数组进行排序
- 任何种类的分数 在任何类型的订单中
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- std::map 保存任何值类型
- 为自定义打印调试实现传递任何类型的变量
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 重载运算符:常量与非常量返回类型:任何性能差异
- 通过引用传递自定义类型-任何性能优势