13

私は Python で遊んでいて、特定のポートで UDP パケットをリッスンしています。

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) )

明らかな何かが欠けていますか、それともこれを回避する簡単な方法がありますか?

あなたが流すことができる光を前もってありがとう!

ベンジー

4

2 に答える 2

13

UDP ソケットの「接続がピアによってリセットされました」というエラーは、クライアントが送信したパケットでサーバーから ICMP エラー メッセージ (たとえば、ポートに到達できない、TTL を超えたなど) を受信したことを意味します。

あなたのコードで何が原因なのかはっきりとは言えませんが、2 つのアイデアを提供できます。

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

頑張ってください!

于 2012-10-10T08:39:40.490 に答える