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隔开!!!