0

これを示すサンプル コードは見つかりませんでした。以下は、一連のソケットでテストしたコードの一部です。(以下のコードではありません)、関連するすべてのソケットを監視するために、"except_set" を "read_set" と "write_set" の結合に設定したことに注意してください。

基本的に私が期待しているのは、エラーが発生したときです。エラーのあるソケットのリストを出力する必要があります。ただし、私が観察したのは、「n == -1」の場合で、1 つのエラー メッセージ (私の場合は「不正なファイル記述子」) しか表示されません。エラーが発生したソケットを出力することをお勧めします。

別の問題: 「errno」は 1 つしかないため、複数のソケットのエラーをどのように表すことができますか (1 回の select() 呼び出しで複数のソケットでエラーが発生した場合)。私は本当に混乱しています。「except_set」はソケットごとにどのようなエラーをキャプチャしますか? 正しい使い方とは?どうもありがとう。

    int n = select(max_fd + 1, &(read_set), &(write_set), &(except_set), &tv);

    if (n == -1)
    {
        perror("select()");
        exit(1);
    }

    else if (n == 0)
    {
        // process time-out ...
    }

    else // (n > 0)
    {
        for (int i=0; i < max_fd; ++i)
        {
            if (FD_ISSET(i, &(read_set)))
            {
                // process read
            }

            if (FD_ISSET(i, &(write_set)))
            {
                // process write
            }

            if (FD_ISSET(i, &(except_set)))
            {
                printf("error, %s, socket= %d", strerror(errno), i);
            }
        }
    }
4

1 に答える 1

2

errnoチェックしている値は、例外的な状態のソケットとは関係ありません。実際には、それは何の関係もありませんselect。以前の呼び出しから残っているか、エラーのない状態で誤って設定されています。意味のある唯一の時間は、標準ライブラリ関数から失敗の戻り値 (通常はまたは)errnoを受け取った直後です。-1NULL

例外的な条件が何を意味するかについて:

ソケットに保留中のエラーがある場合、保留中の例外条件があると見なされます。それ以外の場合、例外的な条件を構成するものは、ファイルの種類によって異なります。ソケットで使用するファイル記述子の場合、以下に示す場合を除き、プロトコル固有です。他のファイル タイプについては、実装定義です。特定のファイル タイプに対して操作が無意味な場合、pselect() または select() は、記述子が読み取りまたは書き込み操作の準備ができていることを示し、記述子に保留中の例外条件がないことを示します。

...

開いているファイルの説明に対して O_NONBLOCK がクリアされ、MSG_OOB フラグが設定された受信操作がブロックせずに帯域外データを返す場合、ソケットは保留中の例外的な状態にあると見なされます。(帯域外データの読み取りに MSG_OOB フラグが使用されるかどうかは、プロトコル固有です。)受信キューに帯域外データ マークが存在する場合、ソケットは保留中の例外条件を持つと見なされます。 . ソケットが保留中の例外的な条件を持っていると見なされる可能性があるその他の状況は、プロトコル固有および実装定義です。

ソース: http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html

ソケットがエラー状態の場合は、SO_ERRORオプションで取得できますgetsockopt

通常、 で設定された例外を使用する必要はありませんselect。ソケットが閉じられている場合は、読み取り可能として表示され、ファイルの終わり (長さゼロの読み取り) が表示されます。ただし、多くの場合、接続の切断はプロトコルスタックによってすぐに検出されないSIGPIPEため、ソケットに書き込もうとすると書き込みエラーが発生するだけです (おそらくそれを抑制しない限り)。もっと長く書く。個人的には、例外的なセットを で使用する機会を見つけたことがありませんselect

于 2013-04-27T01:35:27.337 に答える