2012-08-27 17 views
5

私はPythonで遊んでいて、指定されたポートでUDPパケットを待ち受けていますが、すべて正常に動作しているようですが、長時間経過するとスクリプトは次のエラーでクラッシュします:Python 'Connection reset by peer'

data = self._sock.recv(self._rbufsize) 
socket.error: [Errno 54] Connection reset by peer 

スクリプトだけを再起動すると、短い時間後に同じクラッシュが再び発生します。サーバーを再起動すると、しばらくの間問題が完全に解決されたように見えます。物事のソケット側に関しては

、私がやっている:

UDP_IP = "0.0.0.0" 
UDP_PORT = 6000 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind((UDP_IP, UDP_PORT)) 

は、私が何かを明らかに不足しているか、単にこれを回避するための簡単な方法があるだろうか?

事前にお気軽にお問い合わせください。

ベンジー

答えて

5

UDPソケットのエラー「ピアによって接続リセット」は、クライアントは、ICMPエラーメッセージを受信したことを意味:パケット上のサーバから(例えばポート到達不能を、TTLは、等を超えて)送信しました。

私はあなたのコードでこれを引き起こしているものを確かに言うことはできませんが、私は2つのアイデアを提供することができます:

  1. 接続は、実際に(などの問題をルーティング、サーバ側の障害、)何かによって中断されました。この場合、このエラーをチェックすることができます。エラーが発生した場合は、ソケットを再度開くことができます。
  2. 私にはおそらくもっと似ていますが、あまりよく知られていませんが、SO_REUSEADDRが問題の原因です。このソケットオプションを使用すると、同じポート上で複数のソケットを開くことができます。 が発生します。他のプロセスがポート6000を使用しようとしていて、OSがブロックしないようにOSに指示しているために成功し、ソケットがOSによって閉じられていますか? UDPソケットでSO_REUSEADDRを使用する理由が表示されないため、sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)行を削除してもう一度お試しください。

運が良かった!