2012-08-27 35 views
5

Estoy jugando con Python y escuchando paquetes UDP en un puerto determinado, todo parece funcionar bien, pero después de un período de tiempo prolongado el script se bloquea con el siguiente error:Python 'Connection reset by peer'

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

Al reiniciar solo el script, el mismo bloqueo se produce nuevamente después de un período de tiempo más corto. Reiniciar el servidor en su lugar parece resolver el problema completamente por un tiempo nuevamente.

Con respecto al lado de toma de las cosas, que estoy haciendo:

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

Me estoy perdiendo algo obvio o hay sólo una forma sencilla de evitar esto?

¡Gracias de antemano por cualquier luz que pueda arrojar!

Benji

Respuesta

5

El error "Conexión restablecida por el par" en un socket UDP, significa que el cliente ha recibido un mensaje de error ICMP (por ejemplo: puerto inalcanzable, TTL excedido, etc.) desde el servidor en un paquete ha enviado.

No puedo decir con certeza qué está causando esto en su código, pero puedo ofrecer dos ideas: (problema de enrutamiento, fallo del lado del servidor, etc.)

  1. La conexión fue muy interrumpido por algo . En este caso, puede verificar este error y, en caso de que ocurra, puede volver a abrir el socket.
  2. Lo que parece más probable para mí, pero estoy menos familiarizado, es que SO_REUSEADDR está causando el problema. Esta opción de socket le permite abrir múltiples sockets en el mismo puerto. Lo que ocurre posiblemente, es que algún otro proceso está tratando de usar el puerto 6000, tiene éxito (porque le dice al sistema operativo que no lo bloquee), y su socket está cerrado por el sistema operativo. Como no veo una razón para usar SO_REUSEADDR en sockets UDP, le sugiero que elimine la línea sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) y vuelva a intentarlo.

Best of luck!

Cuestiones relacionadas