FED_SET

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值