socket批量传送文件(基于一个tcp连接),接受不完整
Mu_Gu 2014-05-21 03:34:26 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太慢导致错误?求解决办法,分不多解决了全给啊只有40分