首页 > 解决方案 > TCP连接的奇怪行为

问题描述

我们有以下配置:服务器、客户端、DHCP 服务器。服务器以“客户端模式”在静态 IP 上运行。这意味着,该服务器具有所有客户端(主机名)的列表并建立 TCP 连接。客户端具有动态 IP。

它是如何工作的:1)服务器创建到客户端的连接,2)服务器等待来自客户端的任何数据(我们使用 ACE 框架和反应器模式)。为了更新客户端列表,我们添加了一个额外的计时器,它向所有客户端发送心跳。

还有一种奇怪的行为:假设主机名“somehost.internal”的 IP 为“10.10.100.50”

  1. Time = t:连接到主机名“somehost.internal”
  2. Time = t+1:将客户端的IP更改为“10.10.100.60”
  3. Time = t+2:心跳定时器发送数据到现有端点(10.10.100.50)并成功返回(为什么???这个IP不可访问)
  4. 在 Wireshark 中我可以看到,重新传输包
  5. Time = t+5:几秒钟后事件处理程序返回错误,与端点(10.10.100.50)的连接将关闭

您有什么建议,为什么当远程端点不再存在时阻塞发送函数成功返回?

标签: c++socketstcp

解决方案


我假设在第 3 步中您只向客户端发送了一条心跳消息,但实际上并没有等待客户端对该心跳消息的响应。

套接字send()函数仅将数据转发给操作系统。这并不意味着数据实际传输或已被对等方接收。

操作系统缓冲数据、通过网络传输数据、等待确认、重新传输数据等。这一切都需要时间。最终操作系统将决定另一端不再响应并将连接标记为无效。

只有当您在该连接上执行套接字功能时,应用程序才会通知任何问题。


推荐阅读