2011-01-26 7 views
2

(私はCPython v2.6(Linux、Windows、およびOSX)を使用していますが、私の質問はPythonまたはターゲットシステム固有のものではないと思います)。select()に従ってエラー状態のソケットを読み込み準備ができていますか?

私のアプリケーションがselect([sock], [], [], None)コールとリモート側が突然殺された場合、エラーを選択していないにもかかわらず、選択したコールのブロックを解除することができますか?

ソケットのエラー(例えばselect([sock], [], [sock], None))も確認するのが適切な方法ですが、selectのドキュメントでは、エラーの定義はシステムによって異なります。

+1

3番目のセットは実際にはエラーではありませんが、時にはそれが呼び出されています。これは、TCP緊急データなどの例外的な条件のためです。読取りエラー/リモート切断があり、読取り可能なセットに表示される場合。 – mark4o

答えて

2

manページの読み方によってはselect()のこの領域に多少の曖昧さがあるので、どの程度実装が依存するのかはわかりませんが、私が作業しているシステムはソケットは読み込み可能であり、あなたの読み取りはエラーを返すでしょう(これはもちろんTCPと仮定し、リモート側には接続がRSTです)。重要な部分は "対応するI/O操作を実行することができるならば、 、read(2))。エラーで直ちに返された読取りが真の文である場合シンプルなクライアントサーバーを作成し、クライアントに接続させてから、読み取り用に選択することで、ターゲットシステムでこの動作を確認することをお勧めします。サーバーを受け入れ、1秒間スリープ状態にしてから、終了します。私が典型的に見てきたものがあなたにとって標準的であれば、selectはソケットを読み込み可能な状態に戻し、読み込みはブロックされませんが、接続リセットのエラーを返します。それにもかかわらず、その後の読み取りブロックしながら、Linuxの下では

ああ、ちょうど(linux man pagesから)さらに悪いことに

、(選択)は、「読書のための準備」として、ソケットファイルディスクリプタを報告することがあります。これは、例えば、データが到着したが、検査時に間違ったチェックサムがあり廃棄されたときに起こり得る。ファイルディスクリプタが準備ができていると誤って報告される他の状況があるかもしれません。したがって、ブロックしてはならないソケットでO_NONBLOCKを使用する方が安全です。

関連する問題