【问题标题】:select() max socketsselect() 最大套接字
【发布时间】:2011-03-18 20:22:16
【问题描述】:

只是更多的异步内容!

好的,现在我的主要聊天应用程序有一个工作异步套接字程序,它工作得非常好!但是我有一个担心..

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

如果该限制确实是硬编码的,并且我不能 FD_SETSIZE 限制更高,我是否应该在达到该限制后生成另一个线程?或者是其他东西?这甚至是一个问题吗?

【问题讨论】:

  • 好吧,如果我要正确使用 poll,听起来我被 *nix 卡住了?
  • Windows 有 WSAPoll(),其工作方式与 poll() 非常相似。

标签: c++ sockets select asynchronous


【解决方案1】:

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

A very good article to read.

【讨论】:

  • 感谢您的文章!以及答案!
【解决方案2】:

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

【讨论】:

  • 多次使用 select() 将不起作用,因为限制在于大于 FD_SETSIZE 的 FD。也就是说,一旦使用大于 1024 的 fd,它就会中断。仔细阅读手册页上的注释部分。
  • 如果您为一组新的句柄重构该集或完全使用不同的集,它将起作用。我已经在windows下做过了。
  • 对于我的测试系统,这实际上是我最终要做的。我正在考虑为 1024 的每个倍数简单地生成新线程
  • @JonTrauntvein IIRC,在 Windows 上,FD_SETSIZE 是可以在一组中的套接字数,但在 Linux 中,它是 最大套接字数(加一)可以在一组。所以如果 FD_SETSIZE 为 1024,而你有 1025 个套接字,其中一个的编号为 1025,你不能使用它。 (大约)
【解决方案3】:

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

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

【讨论】:

  • 很棒的提示。感谢分享。
  • 刚看了一下,我试试看!
【解决方案4】:

你没有说你正在使用什么操作系统,但对于大多数人来说,如果你想在 select 中使用高于 1024 的文件描述符,你可以在 #include sys/socket.h 之前将#define FD_SETSIZE 设置为更大的数字。不幸的是,这在 Linux 上不起作用。

【讨论】:

  • 我读过一些关于这方面的内容,不幸的是,服务器可能在多个操作系统上。
猜你喜欢
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
相关资源
最近更新 更多