win32 Socket接收函数recv问题

westice 2010-06-08 09:36:39
  我遇到个很纠结的问题,客户端发过来多少字节按理说我接收多少字节就行了啊。
可到了传文件时就出现问题了,传小文件还好传大文件就不行。

代码:
             int block_size=1;
char file_buf[block_size]; //临时缓冲区
//recv(*temp_sock,(char *)file_data,file_len,0);
/*
*file_len>0则向文件写入网络内容
*  如果:file_len >= block_size
向文件写入block_size长度的内容
file_len减少block_size
文件指针移至末尾
否则:向文件写入file_len长度的内容
   file_len减少file_len
文件指针移至末尾

*/
while(file_len>0){
if(file_len >= block_size){
recv(*temp_sock,(char *)file_buf,block_size,0);
fwrite(file_buf,1,block_size,pt_file);
file_len-=block_size;
fseek(pt_file,0L,SEEK_END);
}else{
char file_buf2[file_len];
recv(*temp_sock,(char *)file_buf2,file_len,0);
fwrite(file_buf2,1,file_len,pt_file);
file_len-=file_len;
fseek(pt_file,0L,SEEK_END);
}
}
如果block_size 为1那就相当于一个循环每接收一个字节写一个字节,大文件小文件都没问题,速度当然很慢
但是把block_size 设为2时,传小文件可以,文件达到10M以上就会丢失一个字节,
我把block_size设为文件的长度,即一次性接收完更不行,后面还有无数字节收不到。
这是怎么回事啊?哪位帮我看看

...全文
355 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
westice 2010-06-10
  • 打赏
  • 举报
回复
呵呵,没仔细学win32,马上去判断返回值,非常感谢各位了!
l28791002 2010-06-09
  • 打赏
  • 举报
回复
TCP是流模式的,你一次发送1K,如果连续发送,接收端不一定每次都是1K,有可能是几百个字节,而且发送的速度快,需要判断是否发送成功,有可能会失败,所以会导致你发大文件的时候出现问题
wolffan3150 2010-06-09
  • 打赏
  • 举报
回复
int recvLen =0;
int block_size=100;
char file_buf[block_size]={0}; //临时缓冲区
int MaxRecvLen = min(block_size,file_len);

while(file_len>0){
recvLen = recv(*temp_sock,(char *)file_buf,MaxRecvLen ,0);
if(recvLen >0){
write(file_buf,1,recvLen,pt_file);
file_len-=recvLen;
}
}
zhou1xp 2010-06-09
  • 打赏
  • 举报
回复
自己在把recv封装一次,确定没有丢失数据,因为recv有时候接收不完全也是返回成功的
悟迟 2010-06-09
  • 打赏
  • 举报
回复
顶一楼,得判断recv的返回值,看到底接受了多少,而不是主观认为它一定接受了多少
Squall_zy 2010-06-09
  • 打赏
  • 举报
回复
你必须自己判断 recv() 的返回值。
先看看定义:
If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned
当 block_size == 1 时,如果接收成功,返回值只可能为1;
当 block_size == n 时,如果接收成功,返回值可能为1至n中任何一个值。例如你想收10字节,但是却可能只收到3字节。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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