【问题标题】:Behavior of Select and FD_SET When Fd is Bigger than 1024Fd 大于 1024 时 Select 和 FD_SET 的行为
【发布时间】:2014-01-08 12:31:38
【问题描述】:

据我所知,select 只支持不超过 1024 个套接字。但是一个进程可以拥有 65535 个套接字,这意味着大多数套接字数都大于 1024,所以我有三个问题:

第一季度。如果将大于 1024 的套接字号传递给 FD_SET() 会发生什么?
Q2。如果将套接字号都大于1024的fd_set传递给select()会发生什么?
Q3。在内核为 2.6.8、x86 64bit 的 Linux Fedora 上,Q1 和 Q2 会抛出异常吗?

【问题讨论】:

  • 恕我直言,如果你有那么多套接字,你真的应该考虑使用 epoll 而不是 select,它的扩展性比 select 好。
  • 您可以使用一些event loop 库,例如libeventlibev
  • 在我的例子中,它返回了错误的“ready to read” fd,并且我的(单线程程序最终在 read() 上无限期阻塞

标签: c++ linux sockets select glibc


【解决方案1】:

fd_set 是一个位数组,只能使用FD_* 宏进行操作,因为 C 没有“位”类型。 (该类型是官方不透明的,并且可以以不同的方式实现 - 实际上 winsock 确实以不同的方式实现它 - 但所有类 unix 的操作系统都使用位数组。)

所以这段代码:

fd_set my_fds;
....
FD_SET(1024, &my_fds);

和这段代码有同样的问题:

char my_fds[1024];
....
my_fds[1024] = 1;

假设 FD_SETSIZE 是 1024。

您将覆盖内存中fd_set 之后的任何内容,如果幸运的话会导致段错误,如果不幸运会导致更微妙的错误。

【讨论】:

  • 我不认为这个答案与这个问题特别相关...... OP想知道如何处理超过 1024个套接字......
  • @Nim 问题都是“如果我这样做会发生什么”,而不是“我应该怎么做” - 我选择回答所提出的问题,而不是跳到预期的后续问题。
猜你喜欢
  • 2017-07-18
  • 2017-07-19
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多