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会导致阻塞,心跳和回执起到补数据的作用。
这样通过补充数据和消息弥补了之前的消息丢失和读取阻塞的缺陷,从而使得系统在高负荷下(视频传输)长时间运行而没有问题,,只是开销太大,机子会烧电,
有人知道更好的方法吗