socket传输文件过程中recv函数接收数据包不完全

socket传输文件过程中recv函数接收数据包不完全

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这个函数。

猜你喜欢

转载自blog.csdn.net/weixin_37723417/article/details/89487453