我认为 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);
...
答案 0 :(得分:6)
int select_ret = select(current_clients + 1, &read_flags, NULL, NULL, &wait);
你的代码错了。您无需传递受监视的文件描述符数。您需要选择您感兴趣的最大描述符并添加1。
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)
。