Chinaunix首页 | 论坛 | 博客
  • 博客访问: 412810
  • 博文数量: 403
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -70
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-05 12:45
文章分类

全部博文(403)

文章存档

2014年(3)

2013年(1)

2012年(3)

2011年(21)

2010年(13)

2009年(64)

2008年(9)

2007年(36)

2006年(253)

分类: C/C++

2006-08-10 10:19:03

FD_ZERO,FD_ISSET这些都是套节字结合操作宏
看看MSDN上的select函数,
这是在select io 模型中的核心,用来管理套节字IO的,避免出现无辜锁定.
int select(  int nfds,fd_set FAR *readfds,  fd_set FAR *writefds,             
  fd_set FAR *exceptfds,       
  const struct timeval FAR *timeout 
);
第一个参数不管,是兼容目的,最后的是超时标准,select是阻塞操作
当然要设置超时事件.
接着的三个类型为fd_set的参数分别是用于检查套节字的可读性,可写性,和列外数据性质.

我举个例子
比如recv(), 在没有数据到来调用它的时候,你的线程将被阻塞
如果数据一直不来,你的线程就要阻塞很久.这样显然不好.
所以采用select来查看套节字是否可读(也就是是否有数据读了)
步骤如下
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
}
阅读(6838) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-03-06 15:01:31

好,通俗易懂