c++ - TCP连接的奇怪行为
问题描述
我们有以下配置:服务器、客户端、DHCP 服务器。服务器以“客户端模式”在静态 IP 上运行。这意味着,该服务器具有所有客户端(主机名)的列表并建立 TCP 连接。客户端具有动态 IP。
它是如何工作的:1)服务器创建到客户端的连接,2)服务器等待来自客户端的任何数据(我们使用 ACE 框架和反应器模式)。为了更新客户端列表,我们添加了一个额外的计时器,它向所有客户端发送心跳。
还有一种奇怪的行为:假设主机名“somehost.internal”的 IP 为“10.10.100.50”
Time = t
:连接到主机名“somehost.internal”Time = t+1
:将客户端的IP更改为“10.10.100.60”Time = t+2
:心跳定时器发送数据到现有端点(10.10.100.50)并成功返回(为什么???这个IP不可访问)- 在 Wireshark 中我可以看到,重新传输包
Time = t+5
:几秒钟后事件处理程序返回错误,与端点(10.10.100.50)的连接将关闭
您有什么建议,为什么当远程端点不再存在时阻塞发送函数成功返回?
解决方案
我假设在第 3 步中您只向客户端发送了一条心跳消息,但实际上并没有等待客户端对该心跳消息的响应。
套接字send()
函数仅将数据转发给操作系统。这并不意味着数据实际传输或已被对等方接收。
操作系统缓冲数据、通过网络传输数据、等待确认、重新传输数据等。这一切都需要时间。最终操作系统将决定另一端不再响应并将连接标记为无效。
只有当您在该连接上执行套接字功能时,应用程序才会通知任何问题。
推荐阅读
- c++ - istream 运营商获得整行空格
- r - R中具有多个变量的条形图
- python - 在 Django 中迁移应用程序时,我一直没有检测到任何更改
- php - XAMPP 7.2.13 php -ext-int 扩展错误
- python - 如何从用户输入中调用列表项
- android - 如何从 JSON 结果中检索流派
- linux - 无法构建 GNU automake - help2man 无法从 automake-1.16 获取 `--help' 信息
- c++ - 我收到错误“变量的类型不完整”,但我找不到问题所在
- ios - 在 Swift 的 spritekit 游戏中定义我的宇宙飞船运动
- c# - 如何在 C# 中创建一个填充两个 DataGridView 的函数