" NFDs的"套接字编程中select()中的参数

时间:2017-06-10 00:17:54

标签: sockets networking network-programming winsock winsock2

我从来没有真正了解这个参数背后的想法,有什么好处?我也注意到在WinSock2中忽略了这个参数,为什么会这样? Unix系统是使用这个参数还是忽略它?

1 个答案:

答案 0 :(得分:3)

视窗' 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()比其它方式更有效。