C++ 当FD大于1024时,Select和FD_集合的行为

C++ 当FD大于1024时,Select和FD_集合的行为,c++,linux,sockets,select,glibc,C++,Linux,Sockets,Select,Glibc,据我所知,select仅支持不超过1024个套接字。但是一个进程可以拥有65535个套接字,这意味着大多数套接字数都大于1024,因此我有三个问题: 问题1。如果将大于1024的套接字数传递给FD_SET(),会发生什么情况? 问题2。如果将套接字号均大于1024的fd_集合传递给select(),会发生什么情况? 第三季度。在内核为2.6.8、x86 64位的Linux Fedora上,会在第一季度和第二季度抛出异常吗?一个fd\u集是一个位数组,只能用fd.*宏操作,因为C没有“位”类型。(

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

问题1。如果将大于1024的套接字数传递给FD_SET(),会发生什么情况?
问题2。如果将套接字号均大于1024的fd_集合传递给select(),会发生什么情况?

第三季度。在内核为2.6.8、x86 64位的Linux Fedora上,会在第一季度和第二季度抛出异常吗?

一个
fd\u集
是一个位数组,只能用
fd.*
宏操作,因为C没有“位”类型。(该类型是官方不透明的,可以用不同的方式实现——事实上winsock的实现方式不同——但所有类似unix的操作系统都使用位数组。)

所以这个代码:

fd_set my_fds;
....
FD_SET(1024, &my_fds);
char my_fds[1024];
....
my_fds[1024] = 1;
与此代码存在相同的问题:

fd_set my_fds;
....
FD_SET(1024, &my_fds);
char my_fds[1024];
....
my_fds[1024] = 1;
假设
FD_SETSIZE
为1024


您将在内存中重写<代码> FDYSET/<代码>之后,如果幸运的话,会导致StEngbug,如果不是的话,会有更微妙的错误。

imHo,如果您有那么多个套接字,您确实应该考虑ePobe而不是选择,它比选择更好地缩放。它返回了错误的“ready to read”fd,而我的(单线程程序最终被无限期地阻塞在一个read()上。我不认为这个答案与这个问题特别相关……OP想知道如何处理1024个以上的套接字…@Nim问题都是“如果我这样做会发生什么”,而不是“我应该做什么”-我选择回答被问到的问题,而不是跳转到预期的后续问题。