用SIO_KEEPALIVE_VALS做心跳检测是不是不靠谱?

mxzy55560593 2012-12-13 07:17:55
我用SIO_KEEPALIVE_VALS做心跳检测,5秒一次,频率时间是1秒
我的理解是:当客户端异常断开,投递到这个客户端wsarecv会在GetQueuedCompletionStatus自动返回
但我实际测试是:在客户端异常断开的情况下,很多wsarecv都没在GetQueuedCompletionStatus返回

检查了一天的程序了,还是不确定到底是我程序的问题还是这个机制的问题

希望用这个东西做过实际项目的谈谈这种心跳可行不 谢谢啦
...全文
584 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2012-12-14
  • 打赏
  • 举报
回复
KEEPALIVE有有效时间是几十分钟的,,所以还是得自己实现心跳包
Squall_zy 2012-12-14
  • 打赏
  • 举报
回复
给你我的一点心得。 4、关于心跳信号。心跳,也称之为TCP保活定时器,是为了检测TCP链路的连接状态的。可惜保活并不是TCP规范中的一部分。套接字本身是有一套心跳保活机制的,不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后,并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机制只是操作系统底层使用的一个被动机制,原理上不应该被上层应用层使用。当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动通知上层应用的,只有在调用相应的IO操作在返回值中检查出来。因此,忘记SO_KEEPALIVE,在应用层自己写一套保活机制比较靠谱(自己来设计心跳信号吧)。
bsnry 2012-12-14
  • 打赏
  • 举报
回复
引用 3 楼 fishion 的回复:
KEEPALIVE有有效时间是几十分钟的,,所以还是得自己实现心跳包
好像可以修改, 用的多还是自己搞的心跳包
Eleven 2012-12-13
  • 打赏
  • 举报
回复
自己实现心跳机制吧~
看不见的裂痕 2012-12-13
  • 打赏
  • 举报
回复
知道这东西,不过还是用自主心跳包,开定时器,一般超过3次超时就自动断网。 好控制

18,363

社区成员

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

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