1

クライアントからポートの範囲で接続を受け入れて転送する単純なフォワードプロキシサーバーを作成しました。

接続が確立されたら、select() を使用して監視するソケット リストにそれらを追加します。fd ごとに 1 つのスレッドで read() を使用する方がよいことはわかっています。

接続ごとに 1 つのスレッドを使用できないため、いくつかの制限があるため、select() を使用しています。しかし、selectが教えてくれないので、クライアントが接続を閉じたかどうかはわかりません。それを理解する方法はありますか?

4

3 に答える 3

3

select() が、読み取りセットに配置したファイル記述子にイベントがあることを通知した場合、read() または recv() などを呼び出してデータを読み取る必要があります。

read() が 0 を返す場合、もう一方の端は接続の端を閉じています。read() が -1 を返す場合、何らかのエラーが発生しており、errno を検査してその内容を確認する必要があります。errno が EAGAIN または EWOULDBLOCK の場合は、単純に select() ループに戻る必要があります。それ以外の場合は、ソケットを閉じる必要があります。

于 2012-08-08T20:49:16.847 に答える
0

select() の 4 番目の引数は、ファイル記述子のビットマスクを取り、例外を監視します。読み取りおよび/または書き込みの場合と同じようにビットを設定し、選択が戻った後にそれらをテストします。それらが設定されている場合は、通常どおり read() を呼び出すことでエラーを取得できます。

于 2012-08-08T20:45:33.437 に答える