非阻塞socket时用的 select函数的第一个参数,为啥经常是sockID+1?

在通常的 *nix 的操作系统中,文件的 fd 分配的时候总是取最小的没有被分配的值,用于 select 的 fd_set 被实现为了一个位图,select 也就需要一个参数来表明需要查询的 fd 的范围。(见pselect)非阻塞socket时用的 select函数的第一个参数,为啥经常是sockID+1?

而在Windows中,套接字的句柄不一定是连续分配的(实际上是 HANDLE),于是 fd_set 也就只好被实现为了一个表示数组长度的值 + 一个存句柄的数组,select 的第一个参数也就没什么用,直接被忽略掉了,仅仅是为了兼容而存在。(见select function (Windows))非阻塞socket时用的 select函数的第一个参数,为啥经常是sockID+1?
【非阻塞socket时用的 select函数的第一个参数,为啥经常是sockID+1?】
(稍微有点乱,凑合着看……)
■网友
你就不能先man 一下select吗?
■网友
因为Select的第一个参数是所监听的最大描述符数,而描述符都是从0(标准输入)开始的,所以要在Open_listenfd(port) 所获取的监听描述符基础上加1。可参考CSAPP第12章网络并发编程-基于多路IO复用的并发编程。
■网友
你也可以+2啊,只要你的文件描述符号小于这个范围,缩小范围。


    推荐阅读