IO复用函数select()限制最大1024的问题【DaemonCoder】
问题
IO复用函数select()关于最大1024的限制,不仅仅限制了最多监听1024个socket,还限制了被监听socket的文件描述符数值不能超出1024????不然会数组越界????
fd_set结构体
下面的源码可以看出,select()需要传入三个fd_set类型的参数,fd_set是一个结构体,存储了一批文件描述符各自是否有事件触发,如第一个fd_set类型的参数表示文件描述符集合中哪些可读事件触发,第二个表示可写事件,第三个表示出错事件。一旦有关心的事件触发,select()返回,三个fd_set被重置,事件触发的文件描述符对应被标记为1。
fd_set如何记录有事件触发再来看fd_set结构体是怎么记录一批文件描述符是否有事件触发的。仔细看fd_set结构的定义可以发现,他其实是一个__int32_t类型的数组,数组所有元素加起来共包含1024bit(由FD_SETSIZE定义)。记录某个文件描述符是否触发事件时,一个bit代表一个文件描述符的状态,0表示没有触发事件,1表示触发,把文件描述的数值映射为下标,计算出哪一bit代表了这个文件描述符的状态。因此可以看出,一旦文件描述符的数值超出1024,计算出的下标就有可能超出__int32_t数组的最大下标位置,所以有可能会出现数组越界的问题。