免费注册 查看新帖 |

Chinaunix

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

[C] linux select 返回-1 errno是Bad address [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-08 11:16 |只看该作者 |倒序浏览
本帖最后由 liqingfang 于 2011-06-08 11:50 编辑

现在linux平台用select还是存在的,这个只是测试代码,但应该没问题,出错的原因老是select调用返回-1,errno的信息是Bad address,但select之前的bind是没有报错的,怎么会是Bad address呢,望各位高手指点。谢谢!
  1.         struct sockaddr_in myname,cliaddr;
  2.         fd_set fdread;
  3.         struct timeval timeout;
  4.         pid_t pid;
  5.         socklen_t addrlen;
  6.         int new_sock = 0;
  7.         myname.sin_family = AF_INET;
  8.         myname.sin_port = htons(7878);
  9.         bzero(&myname.sin_zero,8);
  10.         inet_aton("192.168.1.216",&myname.sin_addr);       
  11.        
  12.        

  13.         int sock = socket(AF_INET,SOCK_STREAM,0);
  14.         if(sock<0)
  15.         {
  16.                 syslog(LOG_ERR,"can not create socket");
  17.                 return -1;        
  18.             }


  19.         fcntl(sock,F_SETFL,O_NONBLOCK);

  20.         int flag = 0;
  21.         if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(flag))<0)
  22.             {
  23.                 syslog(LOG_ERR,"can not set sock opt");
  24.                 return -1;
  25.             }
  26.        

  27.         syslog(LOG_INFO,"before bind errno is %s",strerror(errno));       

  28.         if(bind(sock,(struct sockaddr *)&myname,sizeof(myname))<0)
  29.             {
  30.                  syslog(LOG_ERR,"can not bind addr");
  31.                  return -1;
  32.             }
  33.         syslog(LOG_INFO,"after bind  errno is %s",strerror(errno));        
  34.             if(listen(sock,7)<0)
  35.             {
  36.                 syslog(LOG_ERR,"can not listen");
  37.                 return -1;
  38.             }
  39.          syslog(LOG_INFO,"after listen  errno is %s",strerror(errno));
  40.             //fd_set  fdread;
  41.         syslog(LOG_INFO,"Listening for connections on port %d\n",htons(myname.sin_port));


  42.                
  43.         while(1)       
  44.         {
  45.                 while(1)
  46.                 {
  47.                
  48.                        FD_ZERO(&fdread);
  49.                       FD_SET(sock,&fdread);
  50.                        
  51.                         timeout.tv_sec = 0;
  52.                         timeout.tv_usec = 500000;
  53.                
  54.                         syslog(LOG_INFO,"before select errno is %s",strerror(errno));       
  55.                          if(!FD_ISSET(sock,&fdread))
  56.                         {
  57.                                 syslog(LOG_INFO,"fd is not set");
  58.                         }

  59.                         int reval = select(sock+1,&fread,NULL,NULL,&timeout);
  60.                         //syslog(LOG_INFO,"select get val is %d\n",reval);
  61. //                        printf("errno is %d\n",errno);
  62. //                        perror("perror");
  63. //                        printf("sterror:%s\n",strerror(errno));

  64.                 if(reval<0)
  65.                 {
  66.                         syslog(LOG_INFO,"Error");
  67.                         syslog(LOG_INFO,"errno is %s",strerror(errno));       
  68.                 }
  69.                 else if(reval==0)
  70.                 {
  71.                         syslog(LOG_INFO,"Wait----");       
  72.                         continue;
  73.                 }
  74.                 else
  75.                 {
  76.                         syslog(LOG_INFO,"(((((()))))))");
  77.                        
  78.                         new_sock = accept(sock,0,0);
  79.        
  80.                 ------

  81. }       
复制代码
log输出为:

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2011-06-08 11:24 |只看该作者
每次select之前都要
         FD_ZERO(&fdread);

         FD_SET(sock,&fdread);

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2011-06-08 11:25 |只看该作者
另外select中用两个&fread可能也是不对的,得用两个fd_set

论坛徽章:
0
4 [报告]
发表于 2011-06-08 11:27 |只看该作者
之前我就是写在while循环里面的,现在改了,测试,也不行,

论坛徽章:
0
5 [报告]
发表于 2011-06-08 11:55 |只看该作者
回复 3# hellioncu


    fd是在文件描述符集合中增加一个新的文件描述符,其实是不用的另外再添加一个fd_set(sock,&fdread),我已经修改了代码,还是不能通过,请指教,这个问题困扰很长时间了

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2011-06-08 12:00 |只看该作者
回复  hellioncu


    fd是在文件描述符集合中增加一个新的文件描述符,其实是不用的另外再添加一个fd ...
liqingfang 发表于 2011-06-08 11:55



    int reval = select(sock+1,&fread,NULL,NULL,&timeout);

你写错了,应该是fdread{:3_184:}

论坛徽章:
0
7 [报告]
发表于 2011-06-08 12:46 |只看该作者
哎呦,我的妈啊,怎么还出这种低级错误,用vim编译的,谢谢楼上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP