我认为select()中的NFDS 确定函数将在READFDS和其他fd_sets中检查多少个套接字.所以如果我们在我们设置3个套接字fd_set,但我想只检查第一个套接字,我必须调用select(1 + 1,...).这是正确的吗?
或者" nfds是三组中任何一组中编号最高的文件描述符,加上1 "在linux中选择man意味着什么不同?另外我们为什么要加+ 1?
示例代码 - 已修复
int CLIENTS[max_clients];//Clients sockets
int to_read;
FD_ZERO(&to_read);
int i;
int max_socket_fd = 0;
for (i = 0 ; i < max_clients ; i++)
{
if(CLIENTS[i] < 0)
continue;
int client_socket = CLIENTS[i];
if(client_socket > max_socket_fd)
max_socket_fd = client_socket;
FD_SET(client_socket , &to_read);
}
struct timeval wait;
wait.tv_sec = 0;
wait.tv_usec = 1000;
int select_ret = select(max_socket_fd + 1, &read_flags, NULL, NULL, &wait);
...
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)int select_ret = select(current_clients + 1, &read_flags, NULL, NULL, &wait);
你的代码错了.您无需传递受监视的文件描述符数.您需要选择您感兴趣的最大描述符并添加1.
标准说:
nfds参数指定要测试的描述符的范围.应在每组中检查第一个nfds描述符; 也就是说,应检查描述符集中从零到nfds-1的描述符
所以它只是预期的语义select:nfds不是文件描述符的数量(正如其名称所暗示的那样),而是观察范围的上限.
引用中的粗体部分还解释了为什么需要为您的内容添加1 nfds.
“ nfds 是三个集合中任何一个中编号最大的文件描述符,加上 1 ”
每个文件描述符都由一个整数值表示。因此,他们不是要求x-th您要检查的描述符,而是要求您的+1 中描述符的最高整数值READFDS。
顺便说一句,你应该检查poll(2)和ppoll(2)。