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

时间:2012-08-19 08:06:14

标签: c linux sockets

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

或者“ nfds是三组中任何一组中编号最高的文件描述符,加上linux select man中的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);
...

3 个答案:

答案 0 :(得分:6)

int select_ret = select(current_clients + 1, &read_flags, NULL, NULL, &wait);

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

The standard说:

  

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

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

报价中的粗体部分还解释了为什么需要向nfds添加1。

答案 1 :(得分:4)

基本上,你放入FD_SET()和类似调用的“fd”是整数。 select所需的“nfds”是所有这些值的max()加1。

答案 2 :(得分:4)

nfds是三组中任何一组中编号最高的文件描述符,加上1

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

是的,你应该看看poll(2) and ppoll(2)