当 Fd 大于 1024 时选择和FD_SET的行为



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

问题 1.如果将大于 1024 的套接字号传递给 FD_SET() 会发生什么情况?
问题 2.如果将套接字编号都大于 1024 的fd_set传递给 select() 会发生什么?
问题 3.在内核为 2.6.8、x86 64 位的 Linux Fedora 上,Q1 和 Q2 会抛出异常吗?

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之后的任何内容,如果您幸运的话会导致段错误,如果您不幸运,则会导致更微妙的错误。

最新更新