HOWTO检测网络电缆已在TCP连接上拔下?(Howto detect that a network

2019-07-18 00:41发布

我有一个C ++接受来自客户端的TCP连接,然后,直到客户决定发送数据的套接字上等待网络应用程序(有时他们不会很长一段时间,这就是确定发送任何东西)。

它主要检测当客户端崩溃或机器关闭错误条件,但它需要多分钟,发现当网络电缆连接到客户端已经被拔掉,我宁愿它尽快注意到这种情况。

我没有在客户端的控制,我不能让他们送东西就像一个“平”。 我的服务器不发出一个“ping”数据包发送到到客户端(但他们不会发送响应),但即使拔掉电源线的write()返回正确的字节数(我看到TCP堆栈发送重试在Wireshark的数据包)。

什么是注意连接丢失的最佳方法是什么? 这将是最方便的,如果我能发现它的write()调用。

我需要这在Windows和Linux上运行。

Answer 1:

不幸的是,有没有办法区分电缆从任何其他原因丢包的另一端被拉出。 说了这么多,你可以在另一端为“无限期丢包”发生在足够长的时间内接近连接丢失(比如T)。 TCP跟踪数据包丢失,所以这样做是一般的方法:

  • 获取在连接UNACKED的字节数(说这是B)
  • 发送数据时,大小= N
  • 设置一个超时= T,火灾时,再次检查UNACKED的字节数。 如果是B + N,再假设对方已经失去连接。 在这一点上,你可以尝试ICMP回显验证你的假设。

获取特定的TCP信息的连接不上UNIX的标准接口,绝对不是到Windows的东西便携。 在Linux中,有一个名为TCP_INFO一个套接字选项,您可以通过调用用getsockopt()。 谷歌应该给你一些例子。 我不知道是否有Windows上的等效选项。

另一种方式来做到这一点(连接丢失的即近似跟踪)是通过RAW插槽。 打开原始套接字,并过滤它仅接受TCP通信的连接。 然后,而不是从TCP获取的信息,以确定是否你正在从另一端什么,只是等待从对方接收到任何数据包。 如果你在规定的期限的东西,那么就意味着对方仍上涨。



Answer 2:

很抱歉,但没有办法检测可以及时无坪/保持连接异常断开。 即使操作系统并不总是知道电缆已被拉动。 这就是为什么write()仍然有效-套接字高兴地缓冲数据在其输出缓冲区,等待在稍后的时间发送,因为套接字状态还没有被OS无效呢。 最终,插座将在内部超时,此时OS终于可以无效连接,让后续操作套接字报告错误。 但是,这需要很长的时间,因为你已经注意到了。

既然你不能发送应用层的ping,尝试启用套接字层保持有效指示,至少。 这可能帮助。 仅适用于Windows 2000 +,你可以使用SIO_KEEPALIVE_VALS通过套接字选项WSAIoctl()它可以让你设定的保持有效指示的实际计时器值。 在所有平台上,你可以使用SO_KEEPALIVE通过选项setsockopt()但是,这并不让你配置定时器的值,所以默认值来代替。



Answer 3:

你的问题是相当复杂的。 有很多事情可能出错,你和你的客户之间。 更多的则只是一个“不插电”电缆。

如果你只是想知道,如果你的用户仍然在线,您可以建立一个新的TCP连接。 因为你需要完成3次握手成功打造你知道客户端在线时连接成功初始化的TCP连接。 这里的问题是,如果你想保持你的当前连接活动您需要其他端口。 不知道这是否是你的情况的问题。

但是,它的声音,你是不是真的发送和从客户端(除了一些平数据)接收数据。 所以,你可以简单地设置在循环中建立一个TCP连接的应用程序(第2步 - 因此收到ACK - 应足够,以确定您的客户端仍在处理网络数据)的每一秒X数量。 如果你没有得到在X毫秒的响应,你可以相当肯定地说,无论是客户端还是在东西之间停止“工作”。

希望这可以帮助。 如果不是,请给出你的工具做一些更多的信息。



文章来源: Howto detect that a network cable has been unplugged in a TCP connection?