fd_set

fd_set是文件句柄的集合。   
    
   FD_ZERO    清空这个集合;   
   FD_SET 往这个集合里面加入一个文件句柄;   
   FD_ISSET      查看某一个文件句柄是否被设置了;   
    
   其中,select的第二个 参数 是“可读”文件句柄的集合;   
   第三个参数是“可写”文件句柄的集合;经常使用的就是这两个参数。   
    
   你可以看一下select 函数 的说明,里面有的。

'fd_set') 是一组文件描述符(fd)的集合。由于fd_set类型的长度在不同平台上不同,因此应该用一组标准的宏定义来处理此类变量:

     fd_set set;     FD_ZERO(&set);        /* 将set清零 */     FD_SET(fd, &set);     /* 将fd加入set */     FD_CLR(fd, &set);     /* 将fd从set中清除 */     FD_ISSET(fd, &set);   /* 如果fd在set中则真 */      

在过去,一个fd_set通常只能包含少于等于32个文件描述符,因为fd_set其实只用了一个int的比特矢量来实现,在大多数情况下,检查fd_set能包括任意值的文件描述符是系统的责任,但确定你的fd_set到底能放多少有时你应该检查/修改宏FD_SETSIZE的值。*这个值是系统相关的*,同时检查你的系统中的select() 的man手册。有一些系统对多于1024个文件描述符的支持有问题。

#ifndef FD_SETSIZE
#define FD_SETSIZE       64
#endif /* FD_SETSIZE */

typedef struct fd_set {
         u_int fd_count;                /* how many are SET? */
         SOCKET   fd_array[FD_SETSIZE];    /* an array of SOCKETs */
} fd_set;

extern int PASCAL FAR __WSAFDIsSet(SOCKET, fd_set FAR *);

#define FD_CLR(fd, set) do { /
     u_int __i; /
     for (__i = 0; __i < ((fd_set FAR *)(set))->;fd_count ; __i++) { /
         if (((fd_set FAR *)(set))->;fd_array[__i] == fd) { /
             while (__i < ((fd_set FAR *)(set))->;fd_count-1) { /
                 ((fd_set FAR *)(set))->;fd_array[__i] = /
                     ((fd_set FAR *)(set))->;fd_array[__i+1]; /
                 __i++; /
             } /
             ((fd_set FAR *)(set))->;fd_count--; /
             break; /
         } /
     } /
} while(0)

#define FD_SET(fd, set) do { /
     u_int __i; /
     for (__i = 0; __i < ((fd_set FAR *)(set))->;fd_count; __i++) { /
         if (((fd_set FAR *)(set))->;fd_array[__i] == (fd)) { /
             break; /
         } /
     } /
     if (__i == ((fd_set FAR *)(set))->;fd_count) { /
         if (((fd_set FAR *)(set))->;fd_count < FD_SETSIZE) { /
             ((fd_set FAR *)(set))->;fd_array[__i] = (fd); /
             ((fd_set FAR *)(set))->;fd_count++; /
         } /
     } /
} while(0)

#define FD_ZERO(set) (((fd_set FAR *)(set))->;fd_count=0)

#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set))
typedef int32_t __fd_mask;

#define _NFDBITS (sizeof(__fd_mask) * 8)      /* 8 bits per byte */

#define __howmany(x,y)   (((x)+((y)-1))/(y))

#ifndef _FD_SET

#   define _FD_SET
    typedef struct __fd_set {
      long fds_bits[__howmany(FD_SETSIZE, (sizeof(long) * 8))];
      } fd_set;

#   ifndef _KERNEL
#     ifdef __cplusplus
         extern "C" {
#     endif /* __cplusplus */

#ifdef _INCLUDE_HPUX_SOURCE
#     define FD_SET(n,p)   (((__fd_mask *)((p)->;fds_bits))[(n)/_NFDBITS] |= (1 <<
((n) % _NFDBITS)))
#     define FD_CLR(n,p) (((__fd_mask *)((p)->;fds_bits))[(n)/_NFDBITS] &= ~(1 <<
((n) % _NFDBITS)))

#     define FD_ISSET(n,p) (((__fd_mask *)((p)->;fds_bits))[(n)/_NFDBITS] & (1 <<
((n) % _NFDBITS)))
#     define FD_ZERO(p)      memset((void *)(p), (int) 0, sizeof(*(p)))
#else
#     define FD_SET(n,p) (__fd_set1(n, p))
#     define FD_CLR(n,p) (__fd_clr(n, p))
#     define FD_ISSET(n,p) (__fd_isset(n, p))
#     define FD_ZERO(p)      memset((void *)(p), (int) 0, sizeof(fd_set))

 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值