关于CAsyncSocket的一些疑惑,新手在这里请指教

Pingo520 2017-01-03 01:34:18
最近在一个程序中用到了异步socket,碰到了一些疑惑,请高手解答。
假设发送方发过来一个数据包,协议采用包头+长度。由于数据过大,底层tcp./ip做了分包处理,
分两次发过来。这样就产生了2 次FD_READ事件,而接收方在接收的时候Onreceive函数里首先recv()一次,
然后循环,根据长度,判断接收到的数据长度是不是一个完整的数据包,如果实际接收长度小于协议里面的长度,
就再recv一次。如果只有一次FD_READ事件没问题,但这一个完整的包产生了2次FD_READ事件,我就感到困惑了。
小弟是新手,意思不知道大家读懂没有。求高手解惑
...全文
118 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pingo520 2017-01-03
  • 打赏
  • 举报
回复
好吧,刚才自己调试了下,发现FD_READ消息并不是说底层分了多少个分包就触发多少次,而是只要接收缓存区还有数据没有读取出来,就会触发FD_READ消息。如果我在一次onreceive里面把缓冲区里的数据都读完了,就不会再次触发FD_READ消息。 结贴,有不同看法的欢迎大家指点,新手求指教
Pingo520 2017-01-03
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
底下的拆包,你应该不需要管,你上层就是不停的接收,直到你对应的数据长度接收完成。然后你再处理
你说的这种和楼下的提议不用异步,用多线程循环接收差不多。但是我想知道的是在异步情况下,这种情况怎么处理,因为已经用了异步,碰到这个问题了,想弄明白。
引用 3 楼 jason_wentzel 的回复:
别用异步socket ,用同步socket 开一个线程一直在那recv就OK了 如果一定要用异步的,发送方加上TCP_NODELAY 试试
碰到问题了要搞懂,这样才能进步啊,
孤客天涯 2017-01-03
  • 打赏
  • 举报
回复
别用异步socket ,用同步socket 开一个线程一直在那recv就OK了 如果一定要用异步的,发送方加上TCP_NODELAY 试试
oyljerry 2017-01-03
  • 打赏
  • 举报
回复
底下的拆包,你应该不需要管,你上层就是不停的接收,直到你对应的数据长度接收完成。然后你再处理
Pingo520 2017-01-03
  • 打赏
  • 举报
回复
或者是我理解有误,请大家多多指点

18,363

社区成员

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

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