从多个套接字中选择 - 正确的NFDS值?

Ari*_*hys 3 c sockets linux

我认为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)

cni*_*tar 6

int select_ret = select(current_clients + 1, &read_flags, NULL, NULL, &wait);
Run Code Online (Sandbox Code Playgroud)

你的代码错了.您无需传递受监视的文件描述符数.您需要选择您感兴趣的最大描述符并添加1.

标准说:

nfds参数指定要测试的描述符的范围.应在每组中检查第一个nfds描述符; 也就是说,应检查描述符集中从零到nfds-1的描述符

所以它只是预期的语义select:nfds不是文件描述符的数量(正如其名称所暗示的那样),而是观察范围的上限.

引用中的粗体部分还解释了为什么需要为您的内容添加1 nfds.


xQu*_*are 6

nfds 是三个集合中任何一个中编号最大的文件描述符,加上 1

每个文件描述符都由一个整数值表示。因此,他们不是要求x-th您要检查的描述符,而是要求您的+1 中描述符的最高整数值READFDS

顺便说一句,你应该检查poll(2)ppoll(2)