免费注册 查看新帖 |

Chinaunix

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

[C] sendto 1000个报文,第一个收不到 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-18 16:57 |只看该作者 |倒序浏览
本帖最后由 jonas_mao 于 2013-07-18 16:58 编辑

代码是测试管理口eth0环回收发包的,
设置eth0为环回模式后, 然后通过sendto发1000个报文, 查看收到的结果,
根据代码收到的结果是第一个报文始终收不到, 后续还会丢一两个.
PS:请问这个是什么, (UDP是不可靠传输, 但有些设备上试过是可以全部接收到的)
  1.        
  2.     if(-1 == fcntl(fd, F_SETFL, O_NONBLOCK))
  3.     {
  4.             close(fd);
  5.         printf("fcntl socket set error!\n");
  6.         return ETHER_PHYLOOPBACK_ERROR;
  7.     }

  8.         memset(&addr, 0, sizeof(addr));
  9.         addr.sll_family = AF_PACKET;   
  10.         addr.sll_ifindex = if_index;
  11.         addr.sll_protocol = htons(ETH_P_IP);
  12.         addr.sll_halen = 6;
  13.         memcpy( addr.sll_addr, sa_mac, addr.sll_halen );  //sa_mac是一个两层广播地址

  14.         for(i = 0; i < packetnum; i++) {
  15.                
  16.                 if (sendto(fd, buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
  17.                         close(fd);
  18.                         return ETHER_PHYLOOPBACK_ERROR;
  19.                 }

  20.                 usleep(10000);
  21.                 /*receive packet*/
  22.                 while(k--){

  23.                         FD_ZERO(&fdset);
  24.                         FD_SET(fd, &fdset);
  25.                         tm.tv_sec = 4;
  26.                         tm.tv_usec = 0;

  27.                         if (select(fd + 1, &fdset, (fd_set *) NULL, (fd_set *) NULL, &tm) <= 0) {
  28.                                 close(fd);
  29.                                 printf("select failed\n");
  30.                                 return ETHER_PHYLOOPBACK_ERROR;
  31.                         }
  32.                         else if (FD_ISSET(fd, &fdset)) {               
  33.                                 memset(recv_buf, 0, sizeof(recv_buf));
  34.                                
  35.                                 if ((ret = recvfrom(fd, recv_buf, sizeof(recv_buf), 0, NULL, NULL)) < 0) {
  36.                                         close(fd);
  37.                                         printf("recv failed, ret = %d\n", ret);
  38.                                         return ETHER_PHYLOOPBACK_ERROR;
  39.                                 }
  40.                                
  41.                                 if (strcmp(buf, recv_buf) == 0) {
  42.                                         break;
  43.                                 }
  44.                         }
  45.                 }
  46.                
  47.                 if(k < 0)
  48.                 {
  49.                         printf("recv a unexcept packet %d\n", i+1);
  50.                         fflush(stdout);
  51.                 }
  52.                 k = 200;
  53.                 usleep(10000);
  54.         }
复制代码

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
2 [报告]
发表于 2013-07-18 17:15 |只看该作者
有遇到过这样的问题的吗?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2013-07-18 17:24 |只看该作者
UDP丢包是正常的, 1000QPS丢包率已经不可忍受, 不必纠结.

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
4 [报告]
发表于 2013-07-18 17:32 |只看该作者
纠结阿, 因为最后程序是按照这个接收包的个数来判断测试是否成功, 丢一个就是不成功.{:3_185:}
回复 3# linux_c_py_php


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-07-18 17:43 |只看该作者
jonas_mao 发表于 2013-07-18 17:32
纠结阿, 因为最后程序是按照这个接收包的个数来判断测试是否成功, 丢一个就是不成功.
回复 3# l ...


我去, 这不科学啊, 丢包没法避免啊.

论坛徽章:
0
6 [报告]
发表于 2013-07-23 11:40 |只看该作者
jonas_mao 发表于 2013-07-18 17:32
纠结阿, 因为最后程序是按照这个接收包的个数来判断测试是否成功, 丢一个就是不成功.
回复 3# l ...


说明你的协议设计是错误的。改用TCP。

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
7 [报告]
发表于 2013-07-23 15:32 |只看该作者
协议是可以改成TCP的, 不过这个和本身平台有关, 可能是平台的一些设置导致的回复 6# JohnBull


   

论坛徽章:
0
8 [报告]
发表于 2013-07-23 16:23 |只看该作者
丢包正常,而且包顺序也不能保证。用包个数来判断成功与否肯定不科学。起码要设计个重传指定包的机制
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP