fd_set具体实现(转)

本文详细介绍了fd_set的数据结构及其在套接字编程中的作用,包括FD_SET、FD_CLR、FD_ISSET和FD_ZERO等宏的实现原理,展示了如何设置和检查文件描述符集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是把fd_set相关的源代码汇总在一起。这样应该知道fd_set的实现详细原理

define FD_SETSIZE      1024
typedef unsigned long   fd_mask;

#define NBBY    8               /* number of bits in a byte */
#define NFDBITS (sizeof(fd_mask) * NBBY)        /* bits per mask */


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

typedef struct fd_set {
        fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
} fd_set;

#define _fdset_mask(n)  ((fd_mask)1 << ((n) % NFDBITS))
#define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= _fdset_mask(n))
#define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~_fdset_mask(n))
#define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & _fdset_mask(n))
#define FD_COPY(f, t)   bcopy(f, t, sizeof(*(f)))
#define FD_ZERO(p)      bzero(p, sizeof(*(p)))

fd_set master_set_read;

FD_SET(600,master_set_read);

=>  master_set_read->fds_bits[(600)/32] |= (1<<(600%32));

 

 

定义如下:

#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;

下面在看看几个宏的定义:

FD_SET 打开类型fd_set的某一位
FD_ZERO初始化fd_set
FD_ISSET测试结构fd_set中的描述字

#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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值