免费注册 查看新帖 |

Chinaunix

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

[C] FD_ISSET 将更新套接字集合,把其中不可读的套节字去掉? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-27 09:56 |只看该作者 |倒序浏览
本帖最后由 iw1210 于 2013-02-27 10:00 编辑

看到一个网友的博客: http://hi.baidu.com/bimufo/item/139700e4d880cba1c00d755c

里面有个例子代码(下面),说: FD_ISSET 将更新这个集合,把其中不可读的套节字去掉,只保留符合条件的套节字在这个集合里面,所以每次while循环都要重新 FD_ZERO 和 FD_SET。 这种说法对吗?

socket    s;   
.....   
fd_set    set;   
while(1)   
{        
       FD_ZERO(&set);//将你的套节字集合清空   
       FD_SET(s,    &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字s   
       select(0,&set,NULL,NULL,NULL);//检查套节字是否可读,   
                                                         //很多情况下就是是否有数据(注意,只是说很多情况)   
                                                         //这里select是否出错没有写   
       if(FD_ISSET(s,    &set)    //检查s是否在这个集合里面,   
       {                                    //select将更新这个集合,把其中不可读的套节字去掉   
                                           //只保留符合条件的套节字在这个集合里面                           
               recv(s,...);   
       }   
       //do    something    here   
}

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
2 [报告]
发表于 2013-03-21 14:07 |只看该作者
       FD_ZERO(&set);                                                                    --清空set
       FD_SET(s,    &set);                                                                --将fd s,加入到set中
       select(0,&set,NULL,NULL,NULL);                                           --监视set中是否有活跃的fd, select应该写成select(0 +1, ................)

       --select成功返回后,检查下s是不是活跃的,当然,在lz的代码里面,set只有一个fd s,所以s一定是活跃的,因此fd_isset这步可以省略。但如果set含有多个fd,那么select成功返回的值活跃的fd的数目,所以还要对fd s做下fd_isset的判断,判断其是不是活跃的。
       或许楼主不明白了,fd_isset不是判断fd在不在集合中吗,怎么是用来检测是不是活跃的? 看一下select的说明,select的第二、三、四个都是值-结果集参数,就是说传进去的set,在select成功返回后,会把set中的不活跃的fd给fd_clr(fd, &set)了。但是活跃就保持不变,或者说fd_set(fd, &set)。

       if(FD_ISSET(s,    &set)   
       {
               recv(s,...);   
       }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP