Select は、セット内のファイル記述子に対応するビットを設定します。そのため、関心のあるファイル記述子のみをテストするだけで、少数のファイル記述子のみに関心がある場合 (および他のものを無視できる場合) は、すべての fds を反復する必要はありません。 .
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(4);
}
if(FD_ISSET(fd0, &read_fds))
{
//do things
}
if(FD_ISSET(fd1, &read_fds))
{
//do more things
}
編集
fd_set 構造体は次のとおりです。
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
ここで、fd_count はソケット セットの数 (したがって、これを使用して最適化を追加できます) であり、fd_array はビット ベクトル (サイズは FD_SETSIZE * sizeof(int)であり、マシンに依存します) です。私のマシンでは、64 * 64 = 4096 です。
したがって、あなたの質問は基本的に次のとおりです。ビットベクトル (約 4096 ビットのサイズ) で 1 のビット位置を見つける最も効率的な方法は何ですか?
ここで 1 つのことを明確にしたいと思います。
「接続されているすべてのソケットをループする」ということは、実際に接続に対して何かを読んだり実行したりしていることを意味するわけではありません。FD_ISSET() は、接続の割り当てられた file_descriptor 番号に位置する fd_set のビットが設定されているかどうかのみをチェックします。効率が目的なら、これが最も効率的ではないでしょうか。ヒューリスティックを使用していますか?
この方法の問題点と、別の方法を使用して何を達成しようとしているのかを教えてください。