select() 可以处理的最大套接字数是多少

本文关键字:套接字 多少 处理 select | 更新日期: 2023-09-27 18:31:39

我想在不使用线程的情况下处理多个客户端,所以我已经阅读了 select() 但我找不到任何关于它可以处理多少套接字的信息,我认为它的默认值是 64,为了增加该限制,我必须做一些调整,对吗? 我必须做的调整是什么?

select() 可以处理的最大套接字数是多少

我猜这个数字实际上是Winsock默认值64。只需编写一些代码来调用Socket Socket.Select(),直到它失败 (*),即可轻松验证这一点。 如果您能够有效地更改托管代码中的限制,

我会感到惊讶,因为限制是在编译时通过重写正在编译的非托管代码中的 #define 来确定的。由于您无法选择重新编译 Socket 类,因此这表明您将无法更改限制。

请注意,无论如何,所有这些都是没有意义的。如果您正在编写托管代码,则实际上没有理由使用 Socket.Select() ,并且完全没有理由使用 Socket 类提供的几个好的异步 API 之一。最简单的方法之一是将Socket实例包装在NetworkStream中,并使用 ReadAsync()WriteAsync() 方法执行 I/O。

就此而言,即使在Winsock中,也没有理由使用select()函数,因为Winsock对IOCP(重叠I/O)的支持效率要高得多,并且没有任何这样的特定限制。

(*)编辑:所以,我实际上对此进行了测试,它以惊人的16373个插槽数失败。因此,基于快速而肮脏的测试,您可以成功执行16372套接字。不过,我不会那样做。