我从来没有真正了解过此参数的含义,这有什么用?我还注意到WinSock2中忽略了此参数,为什么呢?
Unix系统使用此参数还是忽略它?
最佳答案
Windows的select()实现在内部使用链接列表,因此不需要使用nfds参数。
但是,在其他操作系统上,fd_set
结构被实现为保存一个位数组(每个套接字一个位)。例如,以下是在MacOS/X下如何声明它(在sys/_types/_fd_def.h中):
typedef struct fd_set {
__int32_t fds_bits[__DARWIN_howmany(__DARWIN_FD_SETSIZE, __DARWIN_NFDBITS)];
} fd_set;
...并且为了做正确的事,select()调用将必须遍历数组中的位以查看它们包含的内容。通过为select()提供
nfds
参数,我们告诉select()实现只需要遍历数组的前(nfds)位,而不必总是在每次调用时遍历整个数组。这使select()的效率比其他方式更高。
关于sockets - 套接字编程中select()中的“nfds”参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44468268/