Win7 拔网线 select 等待超时,不是立即返回

iamduo 2014-08-15 06:03:56
碰到一个奇葩的情况。 (在 XP 下,一切正常。)

在客户端写了一个 Socket 客户端程序。
其中有一句 select (...... 超时 30分钟);
运行在 Win7 32 位旗舰版。

服务端是放在 XP 里的。
当服务端 Accept 客户端 之后,(也就是 客户端的 select 之前,或者之时)。
把网线直接拔掉。

结果客户端的 select 不是立即返回的。而是硬生生的等足了 30 分钟。(实际数据是 30 秒)。
翘首企盼。。。
...全文
165 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamduo 2014-09-18
  • 打赏
  • 举报
回复
引用 3 楼 jiuchang 的回复:
keepalive是怎么样生效的,为什么会有这种情况的产生 能不能给解释一下
我也不是很清楚。只能大概的个人猜想。 主动断开,和被动断开的原因,所以 Tcp 断开是有几个步骤要应答的。什么 Ack 之类。 (详情可以百度学习一下,我不求甚解了) XP对XP的时候,似乎没有这个问题,在一方拔网线后,另一方就能得到反馈。 或许,是默认的有 KeepAlive 机制吧。 而如果其中一方是 Win7,这个就变成 Bug了。 KeepAlive 类似 Tcp 有第二条线路在发送接收“数据”,而这个“数据”本身的启动,需要由正式数据不收发一段时间触发, 然后反复检查线路是否还通着。 具体的请查一下 Delphi KeepAlive,可以得到具体代码。 我这里就不贴了。
jiuchang 2014-09-17
  • 打赏
  • 举报
回复
keepalive是怎么样生效的,为什么会有这种情况的产生 能不能给解释一下
nice_cxf 2014-09-17
  • 打赏
  • 举报
回复
解决了就接分了,不过拔网线之后,好像ip地址都没了,xp下会没问题?
iamduo 2014-09-17
  • 打赏
  • 举报
回复
搞定。请使用 KeepAlive。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧