免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 18429 | 回复: 8
打印 上一主题 下一主题

在socket编程中怎么判断recv是否接收完成? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-31 21:12 |只看该作者 |倒序浏览
小弟刚开始学习socket,想请教一个问题,怎么判断在一个recv中是否已经接收完成服务器的信息了,我这样试了一下,但是不行, 接收到一些乱字码,请问怎么有效的进行接收。
      send(.......);
      char buf[256];
      printf("receive:\n";
      do
      {
          ret = recv(sockfd, buf, sizeof(buf), 0);
          if(ret == -1)
          {
              perror("recv";
          }
          printf("%s", buf);
      }while(ret == sizeof(buf));

论坛徽章:
0
2 [报告]
发表于 2003-10-31 21:51 |只看该作者

在socket编程中怎么判断recv是否接收完成?

0.  是TCP 还是UDP.
1.  如是TCP ,将此socket 用fcntl 设为O_NONBLOCK. recv() 出错 errno  = EWOULDBLOCK ,  说明读完了.

论坛徽章:
0
3 [报告]
发表于 2003-10-31 22:00 |只看该作者

在socket编程中怎么判断recv是否接收完成?

是TCP,

请问怎么使用fcntl,我不太了解关于阻塞的问题,请给个具体的例子好吗,谢了。

论坛徽章:
0
4 [报告]
发表于 2007-01-15 13:12 |只看该作者
原帖由 scalps 于 2003-10-31 21:12 发表
小弟刚开始学习socket,想请教一个问题,怎么判断在一个recv中是否已经接收完成服务器的信息了,我这样试了一下,但是不行, 接收到一些乱字码,请问怎么有效的进行接收。
      send(.......);
      char buf ...

楼主的这段代码蛮有意思的,unix网络编程上说的很清楚,recv函数读到的数据不一定是你想得到的,比如说你在客户端送了一个字符串有300个字节,但是它一次可能只接收200个,recv返回就是200,然后再去读一次可能读到100, 但是一般来说一次就能直接收到的,(不排除我上述说的情况),如果真的是我上述说的情况你这样的判断也是不对的,因为sizeof(buf)=256,如果你再客户端送过来的数据<256或者刚好=256而分好几次接收都不可能正常的接收的,unp上使用的是while(n=recv(sockfd,buf,bufsize,0)>0)而这样却又很容易导致堵塞在那里而出不来,我建议就一条recv()就行了(当然有出错控制)
去看看unix network program吧,那本书很好的  

论坛徽章:
0
5 [报告]
发表于 2007-01-15 13:18 |只看该作者
一般对方发过来的报文都会有个长度的,如0010abbbbbbbbbbbb,前四位表时包的长度,你可按这个长度去读,读完为止,否则该包无效,如果对方的报文没有指定长度,那你只能按最大长度一次去read,read到多少算多少

论坛徽章:
0
6 [报告]
发表于 2007-01-15 14:30 |只看该作者
some days before, the same question is asked here.

and he got a same answer.

论坛徽章:
0
7 [报告]
发表于 2007-01-15 20:47 |只看该作者
recv不一定一次返回你所要的数据,所以你要分块读,直到读到你想要的数据字节数,或者recv返回0,表示收到对方发来的close请求,或者<0,表示出错!

论坛徽章:
0
8 [报告]
发表于 2007-01-15 20:58 |只看该作者
原帖由 lanying_wzw 于 2007-1-15 20:47 发表
recv不一定一次返回你所要的数据,所以你要分块读,直到读到你想要的数据字节数,或者recv返回0,表示收到对方发来的close请求,或者<0,表示出错!


嗯。边读边移动指针。

====

论坛徽章:
0
9 [报告]
发表于 2007-01-15 22:46 |只看该作者
原帖由 nmzqzw 于 2007-1-15 13:18 发表
一般对方发过来的报文都会有个长度的,如0010abbbbbbbbbbbb,前四位表时包的长度,你可按这个长度去读,读完为止,否则该包无效,如果对方的报文没有指定长度,那你只能按最大长度一次去read,read到多少算多少

是这样的,一般协议中都应该指定这样一个字段来说明要接收的长度,这样才好判断是不是接收完毕了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP