socket批量传送文件,只能收到一部分文件
send端:
for( i = 0;i < (*Path).end() - (*Path).begin();++i) {
fp = fopen((*Path)[i],"rb");
fseek(fp,0,SEEK_END);
LenPng = ftell(fp);
fseek(fp,0,SEEK_SET);
SendLeft = new char [LenPng%MAX_SENDLEN];
itoa(LenPng,big,10);
send(*sock,big,20,0);
int freadint = 0;
//Sleep(10);
cout<<big<<" ";
for(int j = 0; j < LenPng/MAX_SENDLEN+1;++j){ ///////////////////////////////////////File Wenjian J
if((LenPng - count) >MAX_SENDLEN)
fread(SendBig,MAX_SENDLEN,1,fp);
else
{
int readint = fread(SendLeft,LenPng - count,1,fp);
if(readint == 0)
printf("Error");
}
if((LenPng - count) >= MAX_SENDLEN)
sendint = send(*sock,SendBig,MAX_SENDLEN,0);
else
sendint = send(*sock,SendLeft,(LenPng-count),0);
count += sendint;
}
cout<<count<<endl;
count = 0;
fclose(fp);
delete SendLeft;
Sleep(100);
}
接收端:
while(i < times){
sprintf(recvname,"D:\pngrecv\%d %d.png",times,i);
FILE *fp =fopen(recvname,"wb+");
int count = 0;
int recvint = 0;
int recvbig = recv(accsocket,big,20,0);
if(recvbig == 0)
printf(" %dn",WSAGetLastError());
int PngBig =atoi(big);
cout<<PngBig<<" ";
while(count < PngBig){
recvint = recv(accsocket,p,MAX_SENDLEN,0);
fwrite(p,recvint,1,fp);
if(recvint == 0 )
printf(" %d",WSAGetLastError());
count += recvint;
memset(p,0,MAX_SENDLEN);
}
cout<<count<<" "<<endl;
count = 0;
i++;
fclose(fp);
memset(recvtimes,0,20);
PngBig = 0;
memset(big,0,20);
Sleep(100);
}
每次都不能接受所有的文件,一般在中间就发先接收端的接收到的文件大小为0,但不是SOCKET_ERROR,然后接下去的所有接受文件都变成大小0,也就是剩下的文件都接受不到了,同时发送端会卡在一个接收端文件的那个地方,直到接收端结束,然后我在每次发送完一个文件后sleep(1000),然后就可以接受完整,但是这个明显不行,速度效率太慢了,是不是因为我send太快,recv太慢导致错误?求解决办法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
貌似没有吧,我只是新手,我用的是c++,你知道c++怎么设置么?
@Mu_Gua 你是widows还是linux?
回复
windows下的。
你的ip是不是用的ipv6?我也碰到过这个问题,据说ipv6传输太快,传输时还会丢失数据呢。
强制使用ipv4吧,加上参数-Djava.net.preferIPv4Stack=true