为什么socket传输文件出错?(连续多次send或者recv会导致什么?)

1.传输大文件的时候,缓冲区有限,肯定不可能一次性传过去,所以可以使用while循环多次读文件,将每次读取的文件send出去,再继续读文件,再继续send,但是执行的时候发现代码会卡滞,文件传送不过去,这种时候,只需要让接收端在接收到文件后回发一个ACK(随便回发一个字符啥的都行)进行阻塞即可:

发送端:
while(!feof(fp))//只要文件还没结束就要继续fread继续send
{
	filelen=0;//使用前进行初始化
	filelen=fread(FileBuffer,1,FILE_LEN,fp);//读取文件 filelen为读取长度
	send(ClientSocket,FileBuffer,filelen,0);//发送文件内容
	recv(ClientSocket,&block,1,0);//接收对方的ACK信号 
}
send(ClientSocket,"n",1,0);

接收端:
while(1)
{
	memset(FileBuffer,'\0',FILE_LEN);//使用前初始化
	filelen=0;
	filelen=recv(ClientSocket,FileBuffer,FILE_LEN,0);//接收文件内容  1 3
	if(filelen<=0||strcmp(FileBuffer,"n")==0) break;
	send(ClientSocket,"1",1,0);//发送ACK信号给对方
	fwrite(FileBuffer,1,filelen,fp);//写入文件
}

2.传送文件的时候还可能遇到这样的问题,比如,我要传送一个TXT文档,我首先发送给接收方该文档的文件名,之后发送文档内容。但是有时候发现接收方接收的文件名总是比发送方发送的文件名多一串乱码,打开接收端接收的TXT文本时发现文本开头一些内容会丢失。
这只能理解成接收方接收发送方发送的文件名还未结束,发送方就发来了文本内容,这时候接收方自然就将文本内容也将之以为是和文件名一批次到来的数据了。解决方法:同样是避免连续send,接收方接收到文件名后,向发送方send一个ACK(随便发送一个字符都可以),发送方接收到这个信号后才向接收方继续发送文件内容。
总之一句话!!!避免连续只send!!!接收ACK(recv)来将多个send隔开!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值