Tcp Socket已关闭

Mic*_*lli 4 sockets tcp

我一直认为如果你没有实现心跳,就无法知道TCP连接的一端是否意外死亡.如果进程刚刚被杀死并且没有正常退出,则套接字无法发送FIN或让对方知道它已关闭.

(请参阅此处的一些评论,例如http://www.perlmonks.org/?node_id=566568)

但是我连接的股票订单服务器有一个新的"取消断开连接所有订单",如果客户端断开连接,则会取消实时订单.它甚至在我杀死我的过程时也能工作,并且我的应用程序肯定没有心跳.

那么它是如何能够检测到我杀死这个过程的?我的应用程序在Windows Server 2003上运行,订单服务器在Suse Linux Enterprise Server 10上.Windows是否检测到与套接字关联的进程不再存在并发送FIN?

nos*_*nos 9

当进程退出时 - 无论出于何种原因 - 操作系统将关闭它已打开的TCP连接.

还有许多其他方法可以使TCP连接无法检测到

  • 有人在中间拉出一根网线.
  • 另一端的计算机被破坏了.
  • 中间的nat网关默默地断开连接
  • 另一端的操作系统崩溃了.
  • FIN数据包丢失.

虽然启用tcp keepalive,但你最终会检测它 - 至少在几个小时内.