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

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值