sockets - 套接字编程中select()中的“nfds”参数

标签 sockets networking network-programming winsock winsock2

我从来没有真正了解过此参数的含义,这有什么用?我还注意到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/

相关文章:

c++ - 使用 QTcpSocket 发送字节

networking - squeak/pharo 中存在哪些高级网络对象传递设施?

python - 难道windows的setsockopt坏了?

networking - 我如何在 J2ME/BlackBerry 中 ping 服务器?

java - 通过套接字和流的 JAXB - 阅读器 block

c++ - 如何在 Windows 上阻止到某个端口的环回连接?

c# - 无法使用单声道连接到在 ubuntu 上运行的自己的 IPv6 TCP 服务器应用程序

c - 绑定(bind)无效参数

java - 套接字不打印数据

ios - 由远程对等 gcdasyncsocket 关闭的套接字