IO复用函数select()限制最大1024的问题【DaemonCoder】

9dddc39c3ce5c263b17af10b039b380c.png

问题

IO复用函数select()关于最大1024的限制,不仅仅限制了最多监听1024个socket,还限制了被监听socket的文件描述符数值不能超出1024😂不然会数组越界🐷

fd_set结构体

下面的源码可以看出,select()需要传入三个fd_set类型的参数,fd_set是一个结构体,存储了一批文件描述符各自是否有事件触发,如第一个fd_set类型的参数表示文件描述符集合中哪些可读事件触发,第二个表示可写事件,第三个表示出错事件。一旦有关心的事件触发,select()返回,三个fd_set被重置,事件触发的文件描述符对应被标记为1。

dfbf18523ac4a26cf609ac4afbb426b2.png

fd_set如何记录有事件触发
再来看fd_set结构体是怎么记录一批文件描述符是否有事件触发的。仔细看fd_set结构的定义可以发现,他其实是一个__int32_t类型的数组,数组所有元素加起来共包含1024bit(由FD_SETSIZE定义)。记录某个文件描述符是否触发事件时,一个bit代表一个文件描述符的状态,0表示没有触发事件,1表示触发,把文件描述的数值映射为下标,计算出哪一bit代表了这个文件描述符的状态。
因此可以看出,一旦文件描述符的数值超出1024,计算出的下标就有可能超出__i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值