CSocket窗口的FD_READ消息被系统搞丢了?

「已注销」 2012-11-06 12:45:47
服务端和客户端都是用的CSocket窗口方式通信,,可是有时明明有数据而OnReceive()却得不到执行!
过程:
客户端不停地向服务端发数据。
如果数据比较小且发的慢,通信就一切正常,很长时间都不会有事,
如果数据发送较快且较大,5秒之后数据就无法再发出,分析的可能原因是服务端的CSocke窗口搞丢了一个FD_READ消息,于是服务器的接受数据堆起来得不到处理,这也导致客户端的数据write不出去而阻塞。
于是通信一直处于这种死掉的状态。
此时只要我向服务端的CSocke窗口补发一个FD_READ消息,那么通信马上被激活恢复正常。。。可是几秒钟之后就又会丢掉一个FD_READ消息,需要再次补发消息才能恢复正常。


CSocket这种方式难道就如此不靠谱?
或者窗口过程太忙会导致发给此窗口的消息丢失?
高手给分析下吗

我自己尝试了一个方案虽然解决了问题但是依然很不爽:
socket的双端都用定时器高频率地互发心跳和回执包,定时器同时向CSocke发送FD_READ消息。
这样做之后就算系统漏搞丢了FD_READ消息,依然可以通过定时器补回来。
之所以用高频心跳是因为CSocke无法自己判断是否有数据,如果没有数据而去READ会导致阻塞,心跳和回执起到补数据的作用。
这样通过补充数据和消息弥补了之前的消息丢失和读取阻塞的缺陷,从而使得系统在高负荷下(视频传输)长时间运行而没有问题,,只是开销太大,机子会烧电,

有人知道更好的方法吗
...全文
79 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

18,356

社区成员

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

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