2

サーバー側では、readfds で select() を実行しているときに、不正なファイル記述子エラーが返されます。fdset で無効になった fd を見つけるにはどうすればよいですか?

4

2 に答える 2

1

通常、反対側の接続が閉じられるか、RST セグメントが送信されると、selectは戻り、対応する記述子を読み取り準備完了としてマークします。その後、それらからread/を実行recvすると、エラーまたは EOF が返されます。

straceデバッグ用のツール (利用可能な場合) を使用することもできます。selectどの記述子が供給され、どの記述子が呼び出されたreadかを追跡するのに役立ちます。recv

于 2012-09-26T13:03:01.953 に答える
0

次の関数を使用して、ソケットの保留中のエラーを確認できます。

int get_socket_error( int s )  {
    int error;
    socklen_t len = sizeof( error );
    if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &error, &len ) < 0 ) 
        error = errno;
    return error;
}

しかし、@Maximが言っているように、EBADFから戻ってきたのselect(2)は通常、ずさんなコーディングの兆候です。

于 2012-09-26T13:25:37.033 に答える