免费注册 查看新帖 |

Chinaunix

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

怎样知道select的fd_set数组的哪个socket是可以读写的?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-03 16:58 |只看该作者 |倒序浏览
在select函数返回之后,
怎样知道select的fd_set数组的哪个socket是可以读写的??

我在网上看到有人说FD_ISSET可以,
但是FD_ISSET是用来判断某个socket描述符是否属于fd_set的呀,


------------------
革命尚未成果,同志还需努力!

论坛徽章:
0
2 [报告]
发表于 2003-03-03 17:47 |只看该作者

怎样知道select的fd_set数组的哪个socket是可以读写的??

我认为在以下的程序段中,
if(FD_ISSET(new_fd,&sockset))应该返回位假才对啊,
因为new_fd是刚创建的,而且客户也没有
发送数据,客户唯一的操作就是connect


  1. fd_set sockset;
  2. FD_ZERO(sockset);
  3. FD_SET(socket,&sockset);
  4. int maxfd = sockfd+1;
  5. while(1){
  6. select(maxfd,&sockset,NULL,NULL,NULL);
  7. if(FD_ISSET(sockfd,&sockset))
  8. {
  9.       int new_fd = accept(.............);
  10.       FD_SET(new_fd,&sockset);
  11. }
  12. if(FD_ISSET(new_fd,&sockset))
  13. {
  14.      recv(.......);//不应该进来啊,因为new_fd是刚创建的,而且客户也没有
  15.                //发送数据,客户唯一的操作就是connect
  16. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-03-03 20:42 |只看该作者

怎样知道select的fd_set数组的哪个socket是可以读写的??

老兄,select()调用的时候,是要告诉系统你想对什么事件进行关注:读,写或其他网络事件。
select(maxfd,&sockset,NULL,NULL,NULL);
第一个参数表示比所关注的fd最大的+1,
第二个参数表示你想关注读事件的句柄集合
第三个参数表示你想关注写事件的句柄集合
第四个参数表示你想关注其他网络事件的句柄集合
第五个参数表示等待时间

现在分析你的代码:
fd_set sockset;
FD_ZERO(sockset);
FD_SET(socket,&sockset);
int maxfd = sockfd+1;
while(1){
select(maxfd,&sockset,NULL,NULL,NULL);  /* 假设你的select调用没有返回错误 */
if(FD_ISSET(sockfd,&sockset)) /* 表示有一个连接进入 */
{
      int new_fd = accept(.............);  /* 创建一个新的socket fd,还有,你这个地方的new_fd是个局部变量,作用域到下一个}为止,但你后面还引用之,错! */
      FD_SET(new_fd,&sockset);       /* 将new_fd加入关注事件句柄组:大错特错。在select返回后,sockset中所包含的是发生了特定事件的句柄的位图,一般而言应该在下次select调用前重新FD_ZERO(), FD_SET()一遍。而你直接将new_fd加入,现在sockset中应该包含了new_fd和socket的位图 */
}
if(FD_ISSET(new_fd,&sockset)) /* 这样做相当于int i = 1; if (i == 1) {}这样的代码,有意义吗? */
{
    /* 当然应该了,因为是你自己设上去的嘛 */
     recv(.......);//不应该进来啊,因为new_fd是刚创建的,而且客户也没有
               //发送数据,客户唯一的操作就是connect
}

给你个正确的:
fd_set sockset;
FD_ZERO(sockset);
FD_SET(socket,&sockset);
int maxfd = sockfd+1;
int new_fd = -1;
while(1) {
    select(maxfd,&sockset,NULL,NULL,NULL);

    if (FD_ISSET(new_fd, &sockset))
    {
         recv....
         close(new_fd);
         new_fd = -1;
    }

    if(FD_ISSET(sockfd,&sockset))
    {
        if (new_fd >;= 0)
             close(new_fd);
        new_fd = accept(.............);
   }
   FD_ZERO(sockset);
   FD_SET(socket, &sockset);
   if (new_fd >;= 0)
       FD_SET(new_fd);
} /* end while */

写的不好,请斧正,谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-03-03 20:48 |只看该作者

怎样知道select的fd_set数组的哪个socket是可以读写的??

FD_ISSET(int fd, fdset *fdset):检查fdset联系的文件句柄fd是否  
                                可读写,>;0表示可读写。  

另外,你这段代码有点问题,new_fd是上一个if段的局部量,怎么会在外面使用呢?

论坛徽章:
0
5 [报告]
发表于 2003-03-03 22:01 |只看该作者

怎样知道select的fd_set数组的哪个socket是可以读写的??

但是关键问题是那个刚刚加入的new_id根本不可以读写啊,
因为客户只进行了connect的操作,而没有send数据或者关闭,
怎么FD_ISSET(new_id,&rset)就>;0了呢??

请各位大侠告知!

论坛徽章:
0
6 [报告]
发表于 2003-03-03 22:11 |只看该作者

怎样知道select的fd_set数组的哪个socket是可以读写的??

代码只是意义代码,不能实际运行的!

不过还是谢谢上面两位的回答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP