select()最大套接字

时间:2011-03-18 20:22:16

标签: c++ sockets select asynchronous

只是更多异步的东西!

好吧,所以我现在为我的主要聊天应用程序提供了一个有效的异步套接字程序,它的工作非常好!但是我有一个问题..

使用select()时,我可以在每个集合中使用的文件描述符的最大数量是多少?我读过有关1024的限制......

如果该限制确实是硬编码的,并且我无法将FD_SETSIZE限制为更高,那么一旦达到该限制,我是否应该生成另一个线程?或者是其他东西?这甚至是一个问题吗?

4 个答案:

答案 0 :(得分:9)

是的,FD_SETSIZE的限制为1024.您可以通过查看select.h标头轻松检查。人们试图增加限制,但报告在一段时间后从“工作”变为“崩溃”。如果您需要这么多连接,请改用poll

A very good article to read.

答案 1 :(得分:3)

如果您使用Posix兼容系统进行编程,您应该能够使用poll()函数而不是select(),这将取消您提到的限制。或者,您可以连续多次调用select(),但一定要使用相对较短的超时。

答案 2 :(得分:3)

对于真正大量的套接字,请使用像libevent这样的库。

该库可以抽象几个特定于操作系统的高级功能,如/ dev / poll,kqueue,epoll和事件端口。有了这些,你就可以处理大量的连接。

答案 3 :(得分:1)

你没有说你正在使用什么操作系统,但对于大多数人来说,如果你想使用1024以上的文件描述符和select,你可以{#1}}在#including sys / socket之前成为一个更大的数字。 H。不幸的是,这在Linux上不起作用。