Tcp 套接字关闭

标签 tcp sockets

我一直认为,如果不实现心跳,就无法知道 TCP 连接的一侧是否意外终止。如果进程只是在一侧被杀死而没有正常退出,则套接字无法发送 FIN 或让另一侧知道它已关闭。

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

但是我连接到一个股票订单服务器,它有一个新的“断开连接时取消所有订单功能”,如果客户端断开连接,该服务器会取消实时订单。即使我最终终止了进程,它也能正常工作,而且我的应用程序绝对没有心跳。

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

最佳答案

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

还有许多其他方式可以使 TCP 连接在未被发现的情况下失效

  • 有人从中间拔出一根网线。
  • 另一端的计算机遭到攻击。
  • 中间的 nat 网关静静地断开连接
  • 另一端的操作系统严重崩溃。
  • FIN 数据包丢失。

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

关于Tcp 套接字关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428804/

相关文章:

multithreading - 使用 netconn 同时处理多个 LwIP 连接

c# - 解析来自 TCP/IP 连接的 XML 字符串

delphi - 如何使用 TIdTCPClient 或其他 Indy 客户端组件计算网站的响应时间?

node.js - 游戏中node.js和socket.io的大滞后(实时)

windows - 检测对等点是否使用 TCP keepalive (Windows)

c - 在进程之间异步传递文件描述符

sockets - 为什么 FreeBSD 获取 TCP 套接字选项需要锁定写锁?

boost - 使用boost进程库防止子进程继承父进程打开的TCP端口

java - FTP:启动文件传输后何时发送代码 226?

c++ - 如何运行套接字示例 C++?