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分
...全文
1092 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kwer 2015-08-27
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/kwer/9050123
wryyu 2014-05-26
  • 打赏
  • 举报
回复
学习学习。。。
Mu_Gu 2014-05-25
  • 打赏
  • 举报
回复
引用 4 楼 CCED136 的回复:
你文件发送上可能有BUG, 当文件大小正好是 MAX_SENDLEN 的倍数时, 最后一次发送你会调用SEND发送 0 长度的数据 这个时候,发送端连接会断掉吧
可是程序在sleep比较久之后 貌似就不会出现这样的问题,而且出现问题很随机,就是我比如传送20张图片,服务器一直开着,我多次启动send端,就算是这样也会偶尔出现有几次会传送失败
CCED136 2014-05-22
  • 打赏
  • 举报
回复
你文件发送上可能有BUG, 当文件大小正好是 MAX_SENDLEN 的倍数时, 最后一次发送你会调用SEND发送 0 长度的数据 这个时候,发送端连接会断掉吧
Mu_Gu 2014-05-21
  • 打赏
  • 举报
回复
引用 2 楼 CCED136 的回复:
SOCKET 传送文件,首先做好单个文件传输,批量仅仅是循环而已。 send 时,需要判断返回值, 正常情况下返回值会介于 0<return<=length 之间,通常情况下,阻塞式socket, 返回值会等于length。 如果出现不相等时,需要“滑动窗口”实现继续发送
单个文件貌似都不会出错的,这个就是一批次循环,可是循环的前一百文件都接受正确可是后面就会出错。而且错误出现的时间,都是随机的,貌似sleep久了出现错误概率小一点
CCED136 2014-05-21
  • 打赏
  • 举报
回复
SOCKET 传送文件,首先做好单个文件传输,批量仅仅是循环而已。 send 时,需要判断返回值, 正常情况下返回值会介于 0<return<=length 之间,通常情况下,阻塞式socket, 返回值会等于length。 如果出现不相等时,需要“滑动窗口”实现继续发送
Mu_Gu 2014-05-21
  • 打赏
  • 举报
回复
自己顶啊 求大虾解释一下啊 T T跪了

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧