【问题标题】:How to keep a TCP Socket alive and detect a disconnect?如何保持 TCP Socket 活动并检测断开连接?
【发布时间】:2016-02-11 22:19:52
【问题描述】:

在我的 C# 程序中,我使用 TCP 套接字进行通信。 当另一方没有正确调用 Shutdown/Close 或其他什么时,Socket 如何知道没有更多的连接。 例如,当 Internet 连接丢失时。 我对 TCP 的了解是它发送保持活动数据包。什么是标准值,它们发送的频率,我可以在哪里设置间隔以及如何设置断开超时(当没有收到任何东西时,在连接被认为断开之前等待的时间)?

【问题讨论】:

  • 默认情况下 TCP 不发送/接收 keepalive,如果不尝试与对等方交换数据,则无法确定可达性丢失。如果您只是在等待 recv() 调用,您可能会一直等待。
  • Stephen Cleary 有一个了不起的article on Half-Open Sockets。老实说,他博客上的常见问题解答中包含的信息对于理解 TCP 套接字作为一个整体来说是无价的。 Here is the overview for his FAQ 我会给那些可靠的阅读。
  • 这已经被报道了100次。我相信搜索引擎会回答所有这些问题。
  • 我当然使用过搜索引擎,但没有令人满意的结果,也找不到任何关于标准值的信息。例如,这仅说明了有关使用 keep alives 的内容,但没有进一步解释:msdn.microsoft.com/library/…

标签: c# sockets tcp


【解决方案1】:

如果套接字不发送或接收任何数据,则根据定义,套接字是活动的并且是打开的。 TCP 可以永远存在,只要每一端都知道它的当前状态,它仍然可以工作。

您可能会遇到的问题是中间设备(例如状态防火墙)维护与终端设备无关的 TCP 连接超时,并且终端设备不可见。如果之后,两三天甚至四天后,一个设备要在 TCP 通道上发送数据,如果中间设备发送失败,那么只有这样,套接字才会“断开”。

关于您关于 tcp-keep-alives 的问题 - 这取决于操作系统。

这里有一篇关于 Windows 方式的好文章:https://blogs.technet.microsoft.com/nettracer/2010/06/03/things-that-you-may-want-to-know-about-tcp-keepalives/

【讨论】:

    最近更新 更多