4

select()の NFDS は、関数が READFDS およびその他の s でチェックするソケットの数を決定すると思いますfd_set。したがって、 に 3 つのソケットを設定しfd_set、最初の 1 つだけをチェックしたい場合は、select(1 + 1,...) を呼び出す必要があります。これは正しいですか?

または、「nfds は3つのセットのいずれかで最大のファイル記述子であり、それに1を加えたものです」Linuxのselect 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);
...
4

3 に答える 3

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

あなたのコードは間違っています。監視対象のファイル記述子の数を渡す必要はありません。興味のある最大の記述子を選択し、1を追加する必要があります。

標準は言う:

nfds引数は、テストする記述子の範囲を指定します。最初のnfds記述子は各セットでチェックされます。つまり、記述子セット内のゼロからnfds-1までの記述子を検査する必要があります。

selectしたがって、 :の予想されるセマンティクスはnfds、ファイル記述子の数ではなく(名前が示すように)、監視範囲の上限です。

引用の太字部分は、に1を追加する必要がある理由も説明していますnfds

于 2012-08-19T08:09:57.543 に答える
6

nfdsは、3つのセットのいずれかで最も大きい番号のファイル記述子に1を加えたものです

すべてのファイル記述子は、整数値で表されます。x-thしたがって、彼らはあなたがチェックしたい記述子を求めているのではなく、あなたの+1の記述子の最も高い整数値を求めています。READFDS

ところで、あなたはチェックアウトする必要がpoll(2)ありppoll(2)ます。

于 2012-08-19T08:10:51.687 に答える
4

基本的に、FD_SET()に入力する「fd」および同様の呼び出しは整数です。selectに必要な「nfds」は、これらすべての値のmax()に1を加えたものです。

于 2012-08-19T08:10:43.870 に答える