双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

CSOCKET接收数据问题:一发多收和阻塞非阻塞等问题如何解决

zxm927 zxm927 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
双方均为MFC CSOCKET的派生类,客户端发送数据,无论是10个字节也好,20个字节也好,服务器端总是4个字节一收.比如说如果我发20个字节,那它就OnReceive五次.我用sniffer看过,发确实在一个数据包里发的.只可能是收出了问题,而接收用的缓冲区足够大.
我的每个数据包分两部分,前12个字节是自定义头部,中间有个字段指明了后面数据的长度.现在出现了上面的问题,我没法一次收完,但也不知道该怎么收.如果发的是正确的包,那我还可以先收头部(12字节),然后根据头部得到后面数据长度,再接收.但如果故意发个错误的包,就阻塞在那里了.
我试过用setsockopt设定接收缓冲区,但还是一次最多收4个字节;想把套接字设定成异步,用asyncselect将套接字设定成异步,用ioctl设FIONREAD,用setsockopt设SO_RCVTIMEO,函数都成功返回,但没有数据的时候仍然是阻塞在那里.我实在没有办法了.
现在程序的结构就这样了,不大可能不用CSOCKET的派生类.还有的救吗?
...全文
评论 7
收藏 已收藏
分享
返回顶部
zxm927
网络编程 18,356 成员 64,161 内容