据我所知,select只支持不超过1024个套接字。但是一个进程可以拥有65535个套接字,这意味着大多数套接字数大于1024,所以我有三个问题:
Q1。如果将大于1024的套接字号传递给FD_SET()会发生什么? Q2。如果将套接字号大于1024的fd_set传递给select(),会发生什么? Q3。在具有内核2.6.8,x86 64位的Linux Fedora上,Q1和Q2会抛出异常吗?
答案 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
之后的任何内容,如果你是幸运的话会导致段错误,如果你不幸,会导致更微妙的错误。