我一直认为如果你没有实现心跳,就无法知道TCP连接的一端是否意外死亡.如果进程刚刚被杀死并且没有正常退出,则套接字无法发送FIN或让对方知道它已关闭.
(请参阅此处的一些评论,例如http://www.perlmonks.org/?node_id=566568)
但是我连接的股票订单服务器有一个新的"取消断开连接所有订单",如果客户端断开连接,则会取消实时订单.它甚至在我杀死我的过程时也能工作,并且我的应用程序肯定没有心跳.
那么它是如何能够检测到我杀死这个过程的?我的应用程序在Windows Server 2003上运行,订单服务器在Suse Linux Enterprise Server 10上.Windows是否检测到与套接字关联的进程不再存在并发送FIN?
当进程退出时 - 无论出于何种原因 - 操作系统将关闭它已打开的TCP连接.
还有许多其他方法可以使TCP连接无法检测到
虽然启用tcp keepalive,但你最终会检测它 - 至少在几个小时内.