免费注册 查看新帖 |

Chinaunix

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

[C] socket 通信,ARM上和PC上跑的结果不一样,一个能立即响应最新命令,一个不能立即响应 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-06 13:22 |只看该作者 |倒序浏览
UDP

相同的代码:
ARM 和PC上,唯一区别就是 交叉编译了一下
在PC上的表现结果:
1ms定时发 一组命令,发一段时间后,换一个新命令,能立即返回新命令的结果;
ARM上的表现结果:
1ms定时发一组命令,发一段时间后,换一个新命令,不能立即返回新命令的结果,总要先执行几条前面一条命令的结果,也是就要多发几次新命令,才是想要的结果。





查看了两个系统的缓冲区大小如下:
  1. [root@FORLINX6410]# sysctl -a | grep rmem
  2. net.core.rmem_max = 108544
  3. net.core.rmem_default = 108544
  4. sysctl: error reading key 'net.ipv4.route.flush': Permission denied
  5. net.ipv4.tcp_rmem = 4096        87380   260096
  6. net.ipv4.udp_rmem_min = 4096
  7. [root@FORLINX6410]#



  8. root@ubuntu:/mnt/hgfs/vmshare# sysctl -a | grep rmem
  9. error: permission denied on key 'vm.compact_memory'
  10. error: "Invalid argument" reading key "fs.binfmt_misc.register"
  11. error: "Invalid argument" reading key "dev.parport.parport0.autoprobe"
  12. error: "Invalid argument" reading key "dev.parport.parport0.autoprobe0"
  13. error: "Invalid argument" reading key "dev.parport.parport0.autoprobe1"
  14. error: "Invalid argument" reading key "dev.parport.parport0.autoprobe2"
  15. error: "Invalid argument" reading key "dev.parport.parport0.autoprobe3"
  16. net.core.rmem_max = 131071
  17. net.core.rmem_default = 163840
  18. error: permission denied on key 'net.ipv4.route.flush'
  19. net.ipv4.tcp_rmem = 4096        87380        905792
  20. net.ipv4.udp_rmem_min = 4096
  21. error: permission denied on key 'net.ipv6.route.flush'
  22. root@ubuntu:/mnt/hgfs/vmshare#
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2015-05-06 13:39 |只看该作者
回复 1# sasinop
个人怀疑是写代码不注意,导致优化之后结果与预期有差距
无代码无真相


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2015-05-07 09:02 |只看该作者
回复 2# cjaizss

  1. void* udpReadata()
  2. {
  3.         char c;        //        test spi error temp
  4.         int i;       
  5.   unsigned char recvbuf[MAXBUF];
  6.   unsigned char sendbuf[MAXBUF];
  7.   unsigned char queuecmd[4];
  8.   int  ret;   
  9.   // command queue
  10.   Queue q;
  11.   ElemType e_tmp;
  12.   InitQueue(&q);
  13.   
  14.   bzero(recvbuf, MAXBUF );
  15.   bzero(sendbuf, MAXBUF );


  16. /* 创建 EPOLL 句柄,把监听 socket 加入到 epoll 集合里 */
  17.   kdpfd = epoll_create(MAXEPOLLSIZE);
  18.   len = sizeof(struct sockaddr_in);
  19.   ev.events = EPOLLIN | EPOLLET;
  20.   ev.data.fd = listener;
  21.   if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)
  22.   {
  23.     fprintf(stderr, "epoll set insertion error: fd=%d \n", listener);   
  24.   }
  25.   else
  26.   {
  27.     printf("Listen socket added in  epoll success \n");   
  28.   }
  29.   while (1)
  30.   {   
  31.     nfds = epoll_wait(kdpfd, events_udp, 10,-1 );
  32.     printf("nfds values: %d ",nfds);       
  33.     if (nfds == -1)
  34.     {
  35.       perror("epoll_wait \n");
  36.       break;
  37.     }
  38.     printf(" epoll wait ok \n");
  39.    
  40.     for (n = 0; n < nfds; ++n)
  41.     {
  42.       if (events_udp[n].data.fd == listener)
  43.       {
  44.               new_fd=events_udp[n].data.fd;                          
  45.                           int optudp =0; //设接收缓冲区为0 ,,,如果这地方不设置为0,PC上跑,在持续发一个命令一段时间后,再发新命令也不能立即响应。
  46.                           setsockopt(new_fd, SOL_SOCKET, SO_RCVBUF, &optudp, sizeof(optudp));
  47.                           ret = recvfrom(new_fd, recvbuf, MAXBUF, 0, (struct sockaddr *)&client_addr, &cli_len);                          
  48.                           if (ret > 0)
  49.                                   {                                  
  50.                                     printf("\n");
  51.                                     printf("revc Data length from PC:%d \n",ret);
  52.                                     for(i=0;i<ret;i++)
  53.                                             printf("%02X ",recvbuf[i]);                                            
  54.                                     printf("\n");       
  55.                                                                                  
  56.                                     Receive_Process(ret,recvbuf);//处理命令包函数
  57.                                         }
  58.                                   else
  59.                                   {
  60.                                     printf("received failed! error code %d ??message : %s \n",errno, strerror(errno));   
  61.                                   }
  62.           
  63.                                   fflush(stdout);  
  64.                         }
  65.                 }
  66.         }
  67. }
复制代码
在交叉编译时,开启了不优化操作,还是不能,但是发现一个奇怪现象,

持续发一个命令,比如10W次, 再换新命令,待新命令发到第7次后,新命令才能被正确执行...
这个现象很有规律,尝试了很多次,都是7次后,新命令得到执行



   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-05-07 09:04 |只看该作者
准备加队列,所有命令入队列,还未完成

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP