2012-08-27 13 views
5

Ich spiele mit Python herum und höre auf UDP-Pakete auf einem bestimmten Port, alles scheint gut zu funktionieren - aber nach einem längeren Zeitraum stürzt das Skript mit dem folgenden Fehler ab:Python 'Verbindung zurückgesetzt durch Peer'

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

Wenn nur das Skript neu gestartet wird, tritt derselbe Absturz nach einer kürzeren Zeit wieder auf. Ein Neustart des Servers scheint das Problem für eine Weile vollständig zu lösen.

Hinsichtlich der Buchsenseite der Dinge, ich tue:

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

Fehle ich etwas offensichtlich, oder gibt es nur eine einfache Möglichkeit, dies zu vermeiden?

Vielen Dank im Voraus für jedes Licht, das Sie verschütten können!

Benji

Antwort

5

Der Fehler „Verbindung von Peer zurückgesetzt“ auf einem UDP-Socket, bedeutet, der Client eine ICMP-Fehlernachricht empfängt (beispielsweise Port nicht erreichbar, TTL überschritt, etc.) von dem Server auf einem Paket es hat gesendet.

Ich kann nicht sicher sagen, was diese in Ihrem Code verursacht, aber ich kann zwei Ideen bieten:

  1. Die Verbindung wirklich von etwas (Routing-Problem, Server-Seite Ausfall, etc.) unterbrochen wurde . In diesem Fall können Sie nach diesem Fehler suchen, und wenn und wenn es auftritt, können Sie Ihren Socket erneut öffnen.
  2. Was mir eher erscheint, aber ich bin weniger vertraut mit, ist, dass SO_REUSEADDR das Problem verursacht. Mit dieser Socket-Option können Sie mehrere Sockets am selben Port öffnen. Was möglicherweise passiert, ist, dass ein anderer Prozess versucht, Port 6000 zu verwenden, erfolgreich ist (weil Sie dem Betriebssystem sagen, es nicht zu blockieren), und Ihr Socket wird vom Betriebssystem geschlossen. Da ich keinen Grund sehe, SO_REUSEADDR auf UDP-Sockets zu verwenden, würde ich vorschlagen, dass Sie die Zeile sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) entfernen und es erneut versuchen.

Viel Glück!

Verwandte Themen