【发布时间】:2017-06-10 00:17:54
【问题描述】:
我从来没有真正理解这个参数背后的想法,它有什么用?我还注意到这个参数在 WinSock2 中被忽略了,这是为什么呢? Unix 系统是使用这个参数还是忽略它?
【问题讨论】:
标签: sockets networking network-programming winsock winsock2
我从来没有真正理解这个参数背后的想法,它有什么用?我还注意到这个参数在 WinSock2 中被忽略了,这是为什么呢? Unix 系统是使用这个参数还是忽略它?
【问题讨论】:
标签: sockets networking network-programming winsock winsock2
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() 比其他方式更有效率。
【讨论】: