免费注册 查看新帖 |

Chinaunix

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

[函数] send 和 recv 函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-05 19:19 |只看该作者 |倒序浏览
服务器端通过while来循环调用send函数批量把一个c 的struct的集合传递到server端,server 端在一个while 循环中用recv函数来接收send过来的数据,有数据的时候就recv没有数据的话自然阻塞在recv调用上,server端是迭代服务器没有做fork模式的并发服务器。

但是最近却发现了一个问题,在客户端数量很多的时候recv过来的struct中经常会少数据,有些struct成员就是空白的,请问为什么会发生这个问题呢???

论坛徽章:
0
2 [报告]
发表于 2008-09-05 19:23 |只看该作者

回复 #1 oract666 的帖子

后来修改了程序,在客户端每次调用send之后都sleep 一秒钟,就发现数据都正常了。

论坛徽章:
0
3 [报告]
发表于 2008-09-05 19:27 |只看该作者
检查发送/接收成功的字节数,
1,确保数据都成功发送了
2,确保接收到了所有欲接收的数据

论坛徽章:
0
4 [报告]
发表于 2008-09-05 19:33 |只看该作者
原帖由 tyc611 于 2008-9-5 19:27 发表
检查发送/接收成功的字节数,
1,确保数据都成功发送了
2,确保接收到了所有欲接收的数据



我send 后打印了send函数的返回值,发现返回值都是完整的数据包长度
在recv后也打印了recv的函数返回值,发觉其中有好几个都小于完整数据包的长度
我send和recv'的第三个参数len都是固定的完整数据包长度,请问这用什么方法可以确保recv的完整性呢??

论坛徽章:
0
5 [报告]
发表于 2008-09-05 19:35 |只看该作者
没读完为什么不继续读?

论坛徽章:
0
6 [报告]
发表于 2008-09-05 19:41 |只看该作者
原帖由 oract666 于 2008-9-5 19:33 发表



我send 后打印了send函数的返回值,发现返回值都是完整的数据包长度
在recv后也打印了recv的函数返回值,发觉其中有好几个都小于完整数据包的长度
我send和recv'的第三个参数len都是固定的完整数据包长 ...

用循环,直接发送或者接收完毕

论坛徽章:
0
7 [报告]
发表于 2008-09-05 20:00 |只看该作者
原帖由 tyc611 于 2008-9-5 19:41 发表

用循环,直接发送或者接收完毕


请问循环是怎么使用? 这样可以吗:

while(1)
     {
             bzero(&myinfo,sizeof(info));
             ircv=recv(connfd,&myinfo,sizeof(myinfo),0);
             while( (ircv>0) && (ircv<sizeof(myinfo)) )
                ircv=ircv+recv(connfd,&myinfo+ircv,sizeof(myinfo)-ircv,0);
             if(ircv>0)
              {
                     printf("\n%s,%d\n",myinfo.info1,ircv);
              }
             else if(ircv<=0)
                  {
                      close(connfd);
                      break;
                  }
      }

[ 本帖最后由 oract666 于 2008-9-5 20:01 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-09-05 20:01 |只看该作者
原帖由 gawk 于 2008-9-5 19:35 发表
没读完为什么不继续读?


菜鸟级,呵呵

论坛徽章:
0
9 [报告]
发表于 2008-09-05 20:15 |只看该作者
原帖由 oract666 于 2008-9-5 20:00 发表


请问循环是怎么使用? 这样可以吗:

while(1)
     {
             bzero(&myinfo,sizeof(info));
             ircv=recv(connfd,&myinfo,sizeof(myinfo),0);
             while( (ircv>0) && (ir ...



如此也有问题,我用了MSG_WAITALL 参数,没用循环解决了
但是很想知道如果循环的话究竟怎么用?呵呵

论坛徽章:
0
10 [报告]
发表于 2008-09-05 20:18 |只看该作者
如果send一个很大的buf的时候是否也存在一次send的字节数不等于数据包实际大小的情况呢?
是否也要通过循环send或者设置什么参数来解决呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP