2

サーバー/クライアントのセットアップでは、サーバーが少数の(現時点では4つ)異なるソケットでクライアントに接続しています。現時点では、計算されたset_sizeでselectを使用していますが、代わりにFD_SETSIZEを使用する価値がある前に、上限は何ですか?

以下は、ポイントを説明するためのいくつかのコード例です。最初にセットを作成します。

FD_ZERO(&set);
FD_SET(socket1, &set);
FD_SET(socket2, &set);
FD_SET(socket3, &set);
FD_SET(socket4, &set);

set_sizeの計算方法は次のとおりです。

set_size = MAX(socket1, socket2);
set_size = MAX(set_size, socket 3);
set_size = MAX(set_size, socket4);
set_size += 1;

そして使用法:

while ((cnt = select(set_size, &set, NULL, NULL, &t)) != -1 || errno == EINTR) {
    if (cnt > 0)
        // Do different stuff depending what socket is active
    else
        // Keep everything alive and add the sockets to the set again
}

最近、2つの新しいソケットを追加する必要があり、将来さらに追加する必要があるかもしれません。計算されたset_sizeではなくFD_SETSIZEを使用するのはいつですか?

4

1 に答える 1

2

select()そもそも使用することによるパフォーマンスの低下と比較して、非常に小さな違いしかないように思われるため、これについて心配したことはありません。

そうは言っても、計算するのにそれほど費用がかからないので、正しい値を計算することは常に価値があると思います:set_sizeあなたが提案するようにローカル変数に現在の値を保持する場合、それはO(1)であり、追加するたびに非常に低い定数ですfd (つまり、比較および場合によっては更新)。fd の削除もO(1)ですが、それがリストの最後のものであることを除きます (この場合はO( set_size)ですが、通常はより優れています)。一方、を呼び出すたびset_sizeにカーネルがすべてのエントリをトラバースする必要があることを意味します。はおそらく よりもかなり小さいため、小さい値を指定するのが得策です。に近くても計算するFD_SETSIZEselectset_sizeFD_SETSIZEset_sizeFD_SETSIZEset_size非常に安いので、ほとんどの場合、まだ価値があります。

poll()もちろん、この程度のパフォーマンスが心配な場合は、の代わりに見る必要がありますselect()。ただし、これらの関数はそれぞれ Linux と FreeBSD (MacOS を含む) でのみ使用できるため、移植性はありませepollん。kqueue

于 2012-11-07T16:26:38.767 に答える