IOCP 与 keepalive问题

_船长_ 2015-07-31 03:18:35
为了检测客户端的异常掉线,比如说网络中断或者客户机崩溃,设置了TCP套接字的keepalive属性,实际中发现,当客户端强退时,GetQueuedCompletionStatus函数返回false,错误码为64(对端强退),但是如果客户端网络断掉时,服务器这边GetQueuedCompletionStatus函数是没有返回的,PS:当客户端连接进来后,我调用了WSARecv函数,既然如此,那客户端网络断掉时,GetQueuedCompletionStatus肯定会返回WSARecv错误,但实际就是没有返回,因此,对于网络断掉情况,就无法检测出,

我的系统是WIN7 64位,程序是32位的,

希望高人指点下啊
...全文
190 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小竹z 2015-08-12
  • 打赏
  • 举报
回复
keepalive是tcp全局属性,如果修改了,会影响系统所有tcp,不建议修改,自己程序应该加心跳包来检测网络异常。
_船长_ 2015-08-12
  • 打赏
  • 举报
回复
后来自己加了心跳包,完美解决了问题,感谢大家的回复
wanglovec 2015-08-08
  • 打赏
  • 举报
回复
心跳包解决问题
oyljerry 2015-08-07
  • 打赏
  • 举报
回复
直接服务器,客户端单独走一条心跳包的通道,维护也简单。
chmuggmwtg 2015-07-31
  • 打赏
  • 举报
回复
同意楼上的。书上说,Tcp的Keepactive是两小时的,都够断很久了。应用层一般定时发心跳。
xian_wwq 2015-07-31
  • 打赏
  • 举报
回复
依赖TCP套接字的keepalive属性要彻底解决这个问题 是不够的, Server端必须得有超时清理逻辑来兜底
shenyi0106 2015-07-31
  • 打赏
  • 举报
回复
网络异常断开(如客户机宕机,或者直接拔网线的情况)TCP/IP协议本身是可以检测出来的,但是这通常需要很长时间。 针对大规模并发连接的处理,都是增加心跳检测,多长时间没收到客户端的心跳包,就认为客户机断线了。 测试用的或者规模较小的,就无所谓了,反正系统资源相对而言是够用的,是否检测无所谓,反正它自己超也会检测到。
worldy 2015-07-31
  • 打赏
  • 举报
回复
向每个持续的连接发送心跳包

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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