网络编程之select的数据结构fd_set

本文详细解析了fd_set结构,该结构用于实现select和pselect函数中的文件描述符集合。通过定义和计算,得出fd_set实际上是一个长整型数组,能够监控1024个socket,每个socket的值需小于1023以避免溢出。

网上很多资料,大部分写的不准确,看过源码才知道

/* It's easier to assume 8-bit bytes than to get CHAR_BIT.  */
#define __NFDBITS	(8 * (int) sizeof (__fd_mask))
#define	__FD_ELT(d)	((d) / __NFDBITS)
#define	__FD_MASK(d)	((__fd_mask) (1UL << ((d) % __NFDBITS)))

/* fd_set for select and pselect.  */
typedef struct
  {
    __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
  } fd_set;

/* Maximum number of file descriptors in `fd_set'.  */
#define	FD_SETSIZE		__FD_SETSIZE

typedef __fd_mask fd_mask;

定义精简如上,其中,__FD_SETSIZE=1024,#define __NFDBITS (8 * (int) sizeof (__fd_mask)),sizeof (__fd_mask)=8,所以__NFDBITS=64。所以,最后在我的系统中fd_set的结构就是这样

typedef struct
  {
    long fds_bits[16];
  } fd_set;

所以,fd_set是一个long数组,其总长为1024位。

所以它最多能监控1024个socket。

它是按socket的值置对应位的,可想而知,socket的值也只能小于1023,不然就溢出了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值