Python 'Connection reset by peer'
Je suis en train de jouer autour avec Python et d'écoute pour les paquets UDP sur un port donné, tout semble fonctionner bien, mais après une longue période de temps, le script se bloque avec le message d'erreur suivant:
data = self._sock.recv(self._rbufsize)
socket.error: [Errno 54] Connection reset by peer
Lors du redémarrage juste le script, le même incident se produit à nouveau après une courte période de temps. En redémarrant le serveur à la place semble résoudre complètement le problème pour un certain temps encore.
À l'égard de la prise côté des choses, je suis en train de faire:
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) )
Ai-je raté quelque chose d'évident ou est-il juste un moyen simple d'éviter cela?
Merci d'avance pour toute la lumière que vous pouvez perdre!
Benji
OriginalL'auteur Benji Barash | 2012-08-27
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur "Connection reset by peer" sur un socket UDP, signifie que le client a reçu un message d'erreur ICMP (par exemple: port unreachable, durée de vie dépassée, etc.) à partir du serveur sur un paquet qu'il lui a envoyé.
Je ne peux pas dire ce qui est à l'origine de ce dans votre code, mais je peux proposer deux idées:
SO_REUSEADDR
est à l'origine du problème. Cette prise option vous permet d'ouvrir plusieurs sockets sur le même port. Ce éventuellement qui se passe, c'est que d'autres processus est d'essayer d'utiliser le port 6000, réussit (parce que vous dites à l'OS de ne pas le bloquer), et votre socket est fermée par le système d'exploitation. Car je ne vois pas de raison d'utiliserSO_REUSEADDR
sur les sockets UDP, je vous suggère de supprimer la lignesock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
et essayez à nouveau.Bonne chance!
OriginalL'auteur Oded R.