当Fd大于1024时,Select和FD_SET的行为

时间:2014-01-08 12:31:39

标签: c++ linux sockets select glibc

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

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

1 个答案:

答案 0 :(得分:3)

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