Tcp Socket已关闭

时间:2010-03-11 21:26:37

标签: tcp sockets

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:2)

可能正在使用TCP Keep Alive来检查死对等人:

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

答案 2 :(得分:2)

据我所知,操作系统检测到进程终止并关闭进程正在使用的所有文件描述符/套接字/句柄。因此,“杀死”应用程序和“优雅终止”之间没有区别。当然,内核本身必须运行(= pc打开,有线连接......)。但它在操作系统上发送FIN的工作等等...... 此外,如果主机变得无法访问/关闭,断开连接......)中间网关(或客户端本身)可能会检测到事件(例如,运营商丢失,DHCP租约未续订......)并回复发送给的主机死亡的主机出现ICMP错误(主机/网络无法访问)。这会导致对等方的TCP连接中断,但只有在客户端有一些数据包发送给主机时才会发生。