it-swarm.com.de

E/A-Fehler (Socket-Fehler): [Errno 111] Verbindung abgelehnt

Ich habe ein Programm, das urllib verwendet, um regelmäßig eine URL abzurufen, und ich sehe intermittierende Fehler wie: 

E/A-Fehler (Socket-Fehler): [Errno 111] Verbindung abgelehnt. 

Es funktioniert 90% der Zeit, aber die anderen r10% versagen. Wenn Sie den Abruf sofort wiederholen, nachdem er fehlgeschlagen ist, ist er erfolgreich. Ich kann nicht herausfinden, warum das so ist. Ich habe versucht zu sehen, ob Ports verfügbar sind, und das sind sie. Irgendwelche Ideen zum Debuggen? 

Für zusätzliche Informationen lautet die Stapelablaufverfolgung:

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

Bearbeiten - Eine Google-Suche ist nicht sehr hilfreich. Ich habe herausgefunden, dass der Server manchmal Verbindungen ablehnt in der Tat der Fall?

12
Schitti

Verwenden Sie einen Paket-Sniffer wie Wireshark , um zu sehen, was passiert. Sie müssen ein ausgehendes SYN-Paket sehen, ein eingehendes SYN + ACK-Flag und dann ein ausgehendes ACK-Flag. Danach gilt der Port auf der lokalen Seite als offen.

Wenn Sie nur das erste Paket sehen und die Fehlermeldung nach einigen Sekunden des Wartens angezeigt wird, antwortet die andere Seite überhaupt nicht (z. B. bei: nicht angeschlossenes Kabel, überlasteter Server, falsches Paket wurde verworfen) und Ihr lokaler Netzwerkstapel bricht den Verbindungsversuch ab . Wenn Sie RST-Pakete sehen, lehnt der Host die Verbindung ab. Wenn "ICMP-Port nicht erreichbar" oder "Host nicht erreichbar" -Pakete angezeigt wird, werden Sie von einer Firewall oder dem Zielhost darüber informiert, dass der Port tatsächlich geschlossen ist.

Natürlich können Sie nicht erwarten, dass der Dienst zu jeder Zeit verfügbar ist (berücksichtigen Sie alle Fehlerpunkte zwischen Ihnen und den Daten). Versuchen Sie es später erneut.

36
Paul

Wenn Sie ein ECONNREFUSED-Errno erhalten, bedeutet dies, dass Ihr -Kernel am anderen Ende eine Verbindung abgelehnt hat. Wenn es sich also um einen Fehler handelt, liegt er entweder im Kernel oder am anderen Ende in einer ganz bestimmten Weise und versuchen Sie es in Kürze erneut, da dies scheinbar funktioniert:

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

Ersetzen Sie die beiden All-Caps-Konstanten durch Ihre Lieblingszahlen.

10
tzot

Zuvor hatte ich dieses Problem mit meiner EC2-Instanz (ich hatte couchdb als Ressource gedient - ich denke darüber nach Amazon S3).

Zu prüfen ist (unter der Annahme von Ec2), dass der couchdb-Port zu Ihren offenen Ports innerhalb Ihrer Sicherheitsrichtlinie hinzugefügt wird.

Ich bin speziell angetroffen 

"[Errno 111] Verbindung abgelehnt"

über EC2, wenn die Instanz gestoppt und gestartet wurde. Das Problem scheint ein Pidfile-Rennen zu sein. Die Lösung für mich war es, couchdb (ganz und richtig) zu töten über:

pkill -f couchdb

und dann neu starten mit:

/etc/init.d/couchdb restart
3
mekarpeles

Ich weiß nicht genau, was das verursacht. Sie können versuchen, in Ihrem socket.py nachzuschauen (meine ist eine andere Version, daher stimmen die Zeilennummern der Ablaufverfolgung nicht überein, und ich fürchte, einige andere Details stimmen möglicherweise nicht gut überein).

Jedenfalls scheint es eine gute Praxis zu sein, Ihren URL-Code in einen try: ... except: ... -Block zu packen und dies mit einer kurzen Pause und einem erneuten Versuch zu behandeln. Die URL, die Sie abzurufen versuchen, ist möglicherweise heruntergefahren oder zu geladen, und das können Sie sowieso nur mit einem Neuversuch erledigen.

2
Ofri Raviv

Es scheint, dass der Server nicht richtig läuft, also stellen Sie sicher, dass das Terminal per 

telnet ip port

beispiel 

telnet localhost 8069

Es wird mit localhost verbunden zurückgegeben, so dass es kein Problem mit der Verbindung gibt. Andernfalls wird Connection refused zurückgegeben 

1