recv函数接受包不完全,即当recv()返回的大小如果不等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取。
比如通过消息知道下一个包大小为3584,却发现recv函数返回值(recv返回值就是实际接收到的数据大小)却小于3584。
int recv( In SOCKET s, Out char *buf, In int len, In int flags);
recv函数返回其实际copy的字节数
len是请求大小的参数
这个时候可以利用循环,在知道要收包的大小情况下,不断做减法,如recv返回值是1024,下一次recv函数的参数len = 3584 - 1024,一直循环,保证len = 0时退出循环,这样就能完整的一个数据包。
代码如下:
for(length = 0;Pay_loadLen != 0;length += recvlen){
recvlen = recv(remote_fd, ReceiveBuff, Pay_loadLen, 0);
Pay_loadLen = Pay_loadLen - recvlen;
memcpy(RxBuffer+length, ReceiveBuff, recvlen);
memset(ReceiveBuff, 0, sizeof(ReceiveBuff));
}
最后说一下,这里有两个buf为了自己代码使用,如果没必要的一个buf就可以,也不需要调用memcpy这个函数。