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

socket客户端接收数据,是接收完再组包,还是一次接收一个整包?
本帖最后由 ylongwu 于 2014-08-23 00:01:28 编辑
只有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函数等待一定时间重新检测。这种方法比较简单粗暴, 请问通常应该怎么做?

多谢了!
------解决方案--------------------
1 是的,定长接收数据。
2 要接受多长的数据,是发送方决定的告诉接收方的,不是接收方决定的!
------解决方案--------------------
可以考虑全部接受了再分包
------解决方案--------------------
一个线程负责接收数据,把能接收的全部接收放入缓冲区,另外一个线程负责处理检测是否有足够的整包处理,有则处理,两个线程构成生产者-消费者模式

缓冲区,我用过的方法类似于:
struct buf{
      char* pBuffer; //实际缓冲区指针,每次申请固定大小
      int nLen;          //缓冲区里有效的数据量
}
deque<buf*> 表示缓冲区列队