我一直认为如果你没有实现心跳,就无法知道TCP连接的一端是否意外死亡。如果进程刚刚被杀死并且没有正常退出,则套接字无法发送FIN或让对方知道它已关闭。
(请参阅此处的一些评论,例如http://www.perlmonks.org/?node_id=566568)
但是我连接的股票订单服务器有一个新的“取消断开连接所有订单”,如果客户端断开连接,则会取消实时订单。它甚至在我杀死我的过程时也能工作,并且我的应用程序肯定没有心跳。
那么它如何能够检测到我何时杀死了这个过程?我的应用程序在Windows Server 2003上运行,订单服务器在Suse Linux Enterprise Server 10上.Windows是否检测到与套接字关联的进程不再存在并发送FIN?
答案 0 :(得分:9)
当进程退出时 - 无论出于何种原因 - 操作系统将关闭它已打开的TCP连接。
还有许多其他方法可以使TCP连接无法检测
虽然启用tcp keepalive,但最终会检测到它 - 至少在几个小时内就会检测到。
答案 1 :(得分:2)
可能正在使用TCP Keep Alive来检查死对等人:
答案 2 :(得分:2)
据我所知,操作系统检测到进程终止并关闭进程正在使用的所有文件描述符/套接字/句柄。因此,“杀死”应用程序和“优雅终止”之间没有区别。当然,内核本身必须运行(= pc打开,有线连接......)。但它在操作系统上发送FIN的工作等等...... 此外,如果主机变得无法访问/关闭,断开连接......)中间网关(或客户端本身)可能会检测到事件(例如,运营商丢失,DHCP租约未续订......)并回复发送给的主机死亡的主机出现ICMP错误(主机/网络无法访问)。这会导致对等方的TCP连接中断,但只有在客户端有一些数据包发送给主机时才会发生。