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

Mu_Gua 发布于 2014/05/21 15:24
阅读 528
收藏 0

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(" %d\n",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太慢导致错误?求解决办法

加载中
0
明泽妈妈
明泽妈妈

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

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

M
Mu_Gua
回复 @明泽妈妈 : windows下的。
明泽妈妈
明泽妈妈
@Mu_Gua 你是widows还是linux?
M
Mu_Gua
貌似没有吧,我只是新手,我用的是c++,你知道c++怎么设置么?
返回顶部
顶部