我认为 select() 中的 NFDS 决定了该函数将在 READFDS 和其他 fd_set 中检查多少个套接字。因此,如果我们在 fd_set 中设置了 3 个套接字,但我只想检查第一个,则必须调用 select(1 + 1,...)。这是正确的吗?

或者 linux select man 中的“nfds 是三个集合中编号最大的文件描述符,加上 1”是否意味着不同?还有为什么我们需要加+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);
...

最佳答案

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

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

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

关于c - 从多个套接字中选择 - 正确的 NFDS 值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12025133/

10-11 22:09