【问题标题】:"nfds" parameter in select() in sockets programming套接字编程中 select() 中的“nfds”参数
【发布时间】:2017-06-10 00:17:54
【问题描述】:

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

【问题讨论】:

    标签: sockets networking network-programming winsock winsock2


    【解决方案1】:

    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() 比其他方式更有效率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多