socket客户端接收数据,是接收完再组包,还是一次接收一个整包?

ylongwu 2014-08-23 12:00:29
只有20分了,但是还有好几个问题想问一下,大家帮帮忙。。。

服务端发送的数据是 包头+包体,包头int指明包长度,现在我用两种方法来接收:

1。 首先接收一个包头,得到包体长度之后,再接收一个整包:
rv = recv( s, buf, 4, 0); //获取包头
但是 rv = recv( s, buf, 4, 0) 这句也有可能返回的不是4个字节(即使使用的无限时等待),例如是一个字节,2个字节,或者3个字节,请问这时是否应该再加一个循环,直到累计接收长度等于4为止? 因为仅仅是一个包头,感觉还是处理的有些复杂


2。 socket只负责接收数据,并拷贝到Buf中,外部程序不停的检测Buf,如果发现一个整包,就从Buf中剪切出这个包。
这儿有两个地方比较模糊:
第一是Buf,我现在使用的string, 有数据来就加到string中,检测到string中足够一个整包,则剪切出整包。Buf中剩余的部分累加到下次接收的数据中。 请问通常是这样做的吗? 使用vector或者deque,或者直接char数组更好些?

第二是如何来检测Buf中是否足够一个整包? 我现在使用的每隔一定时间来检测,先看包头,再看Buf中接收数据的长度,使用一个while循环,加上一个Sleep函数等待一定时间重新检测。这种方法比较简单粗暴, 请问通常应该怎么做?

多谢了!
...全文
1034 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2014-08-23
  • 打赏
  • 举报
回复
1 是的,定长接收数据。 2 要接受多长的数据,是发送方决定的告诉接收方的,不是接收方决定的!
微型蚂蚁 2014-08-23
  • 打赏
  • 举报
回复
一个线程负责接收数据,把能接收的全部接收放入缓冲区,另外一个线程负责处理检测是否有足够的整包处理,有则处理,两个线程构成生产者-消费者模式 缓冲区,我用过的方法类似于: struct buf{ char* pBuffer; //实际缓冲区指针,每次申请固定大小 int nLen; //缓冲区里有效的数据量 } deque<buf*> 表示缓冲区列队
dajiadoukeyiyongde 2014-08-23
  • 打赏
  • 举报
回复
可以考虑全部接受了再分包

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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