4

gevent パッチを適用したソケットを使用してストリーミング サーバーに接続し、adsl 接続を使用しています。

私はサーバーを制御していませんが、私のテストでは、サーバーを停止すると、recv の結果が空の文字列かどうかを確認するだけで切断を検出できますが、adsl モデムをオフにすると recv は終了しません。コンピューターのネットワーク ケーブルを外しただけでは、空の文字列は返されませんが、再接続すると、その間にサーバーが送信したすべてのものが返されるので、ルーターまたはモデムが接続を開いたままにしているのだと思います。ネットワークケーブルが切断されている間、ストリームをバッファリングします。

socket.SO_RCVTIMEO を数秒に設定しようとしましたが、切断が検出されず、recv は永久に「ブロック」し続けます。これは gevent であるため、グリーンスレッドをブロックするだけですが、再接続を試行できるように、この切断をできるだけ早く検出する必要があります。

4

2 に答える 2

4

with ステートメントなどで、gevent によって提供されるタイムアウトを使用します。

with Timeout(5, False):
    data = sock.recv()

または関数として:

data = gevent.with_timeout(5, sock.recv, timeout_value="")
于 2011-05-15T18:20:27.533 に答える
2

切断がなかったため、切断を検出していません。TCP「接続」はまだ生きており、信頼できると思われます。たとえば、LAN ケーブルを抜き差ししても、接続は機能します。

本当にできるだけ早く切断を検出したい場合は、毎秒 os ネットワーク ステータス (ifconfig/ipconfig)/ を解析するか、os イベントを使用して、ネットワーク切断を検出したときに必要なことを行う必要があると思います。

于 2011-05-15T20:00:49.470 に答える