tcp连接异常



我们有以下配置:服务器,客户端,dhcp -服务器。服务器以"客户端模式"在静态IP上运行。这意味着,该服务器拥有所有客户机(主机名)的列表并构建tcp连接。客户端有动态ip。

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

还有一个奇怪的行为:比如主机名somehost。internal;IP为10.10.100.50,

  1. Time = t: connect to hostname "somehost.internal">
  2. Time = t+1:修改客户端IP为"10.10.100.60">
  3. Time = t+2:心跳定时器发送数据到一个现有的端点(10.10.100.50),并成功返回(为什么?此IP不可访问)
  4. 在Wireshark中我可以看到,Retransmission包
  5. Time = t+5:几秒钟后事件处理程序返回一个错误,与端点(10.10.100.50)的连接将被关闭

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

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

socketsend()函数只将数据转发给OS。这并不意味着数据已经被实际传输或被对等端接收。

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

只有当你在该连接上执行套接字函数时,应用程序才会被通知任何问题。

最新更新