socket批量传送文件,只能收到一部分文件

发布于 2021-11-20 11:06:29 字数 1909 浏览 788 评论 4

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

够钟 2021-11-25 06:34:23

貌似没有吧,我只是新手,我用的是c++,你知道c++怎么设置么?

卸妝后依然美 2021-11-25 01:38:58

@Mu_Gua 你是widows还是linux?

女中豪杰 2021-11-25 01:34:04

回复
windows下的。

清欢 2021-11-24 17:34:04

你的ip是不是用的ipv6?我也碰到过这个问题,据说ipv6传输太快,传输时还会丢失数据呢。

强制使用ipv4吧,加上参数-Djava.net.preferIPv4Stack=true

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文