web-dev-qa-db-fra.com

Erreur d'E/S (erreur de socket): [Errno 111] Connexion refusée

J'ai un programme qui utilise urllib pour aller chercher une url périodiquement, et je vois des erreurs intermittentes Telles que: 

Erreur d'E/S (erreur de socket): [Errno 111] La connexion a été refusée. 

Cela fonctionne 90% du temps, mais les 10% restants échouent. Si vous relancez l'extraction immédiatement après l'échec, l'opération réussit. Je suis incapable de comprendre pourquoi il en est ainsi. J'ai essayé de voir si des ports sont disponibles, et ils le sont. Des idées de débogage? 

Pour des informations supplémentaires, la trace de la pile est la suivante:

File "/usr/lib/python2.6/urllib.py", line 203, in open 
    return getattr(self, name)(url)

File "/usr/lib/python2.6/urllib.py", line 342, in open_http
    h.endheaders()

File "/usr/lib/python2.6/httplib.py", line 868, in endheaders
    self._send_output()

File "/usr/lib/python2.6/httplib.py", line 740, in _send_output
    self.send(msg)

File "/usr/lib/python2.6/httplib.py", line 699, in send
    self.connect()

File "/usr/lib/python2.6/httplib.py", line 683, in connect
    self.timeout)

File "/usr/lib/python2.6/socket.py", line 512, in create_connection
    raise error, msg

Edit - Une recherche sur Google n’est pas très utile, c’est ce que j’en ai tiré, c’est que le serveur Je récupère parfois des connexions refusées, comment vérifier que ce n’est pas un bogue dans mon code. en effet le cas?

12
Schitti

Utilisez un renifleur de paquets du type Wireshark pour voir ce qui se passe. Vous devez voir un paquet sortant avec indicateur SYN, un paquet entrant pour SYN + ACK, puis un message sortant pour ACK. Après cela, le port est considéré comme ouvert du côté local.

Si vous ne voyez que le premier paquet et que le message d'erreur s'affiche après plusieurs secondes d'attente, l'autre côté ne répond pas du tout (comme dans: câble débranché, serveur surchargé, paquet égaré a été ignoré) et votre pile de réseau local abandonne la tentative de connexion . Si vous voyez des paquets RST, l'hôte refuse la connexion. Si vous voyez "Port inaccessible ICMP" ou des paquets inaccessibles à l'hôte, un pare-feu ou l'hôte cible vous informe du port en cours de fermeture.

Bien sûr, vous ne pouvez pas vous attendre à ce que le service soit disponible à tout moment (tenez compte de tous les points de défaillance entre vous et les données), vous devez donc réessayer ultérieurement.

36
Paul

Obtenir une erreur ECONNREFUSED signifie que votre noyau a été refusé une connexion à l’autre extrémité, donc si c’est un bogue, c’est dans votre noyau ou à l’autre extrémité ..__ d'une manière très spécifique et réessayez dans un moment, car cela semble fonctionner:

# This is Python > 2.5 code
import errno, time

for attempt in range(MAXIMUM_NUMBER_OF_ATTEMPTS):
    try:
        # your urllib call here
    except EnvironmentError as exc: # replace " as " with ", " for Python<2.6
        if exc.errno == errno.ECONNREFUSED:
            time.sleep(A_COUPLE_OF_SECONDS)
        else:
            raise # re-raise otherwise
    else: # we tried, and we had no failure, so
        break
else: # we never broke out of the for loop
    raise RuntimeError("maximum number of unsuccessful attempts reached")

Remplacez les deux constantes majuscules par vos numéros préférés.

10
tzot

J'ai déjà eu ce problème avec mon instance EC2 (je servais couchdb pour servir des ressources - je considère le S3 d'Amazon pour l'avenir).

Une chose à vérifier (en supposant que Ec2) est que le port couchdb est ajouté à vos ports ouverts dans votre politique de sécurité.

J'ai spécifiquement rencontré 

"[Errno 111] Connexion refusée"

sur EC2 lorsque l’instance a été arrêtée et démarrée. Le problème semble être une course pidfile. La solution pour moi a été de tuer Couchdb (entièrement et correctement) via:

pkill -f couchdb

puis en redémarrant avec:

/etc/init.d/couchdb restart
3
mekarpeles

Je ne suis pas vraiment sûr de ce qui cause ça. Vous pouvez essayer de regarder dans votre socket.py (la mienne est une version différente, donc les numéros de ligne de la trace ne correspondent pas, et je crains que certains autres détails ne correspondent pas aussi).

Quoi qu'il en soit, il semble être une bonne pratique de placer votre code de récupération d'URL dans un bloc try: ... except: ... et de le gérer avec une courte pause et une nouvelle tentative. L'URL que vous essayez d'extraire est peut-être inutilisable ou trop chargée, et vous ne pourrez le gérer que par une nouvelle tentative.

2
Ofri Raviv

Il semble que le serveur ne fonctionne pas correctement alors assurez-vous qu’avec terminal by 

telnet ip port

exemple 

telnet localhost 8069

Il retournera connecté à localhost , ce qui indique qu'il n'y a pas de problème de connexion Sinon il retournera Connexion refusée cela indique qu'il y a un problème de connexion 

1
Janarthanan Ramu