2013-10-16 2 views
7

ich mit einem bisschen Python bin arbeiten, die wie folgt aussehen:Python Socket-Bibliothek denkt Buchse offen ist, wenn es nicht

HOST = '127.0.0.1' 
PORT = 43434 
single = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    single.bind((HOST, PORT)) 
except socket.error as e: 
    # Print an error, exit. 

Während es in der Vergangenheit gut funktioniert worden ist, jetzt sind wir [Errno 98] Address already in use die Fehler. Der SIGINT-Handler schließt die Socket-Verbindung, daher bin ich mir nicht sicher, wie es in diesen Zustand gekommen ist, aber im Moment versuche ich nur, es zu beheben.

Beide lsof und netstat sagen, es gibt nichts, dass die Port:

[$]> sudo netstat -an | grep 43434 
[$]> sudo lsof -i :43434 

TIME_WAIT auf 60 Sekunden eingestellt ist, nach /proc/sys/net/ipv4/tcp_fin_timeout, aber der Fehler tritt auf, auch Stunden nach dem letzten Lauf erfolgreich.

Ich habe versucht (vorübergehend) REUSEADDR (über single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)), aber das scheint keinen Effekt zu haben.

Was passiert in der Tarnation? Kann ich diesen Anschluss jemals wieder verwenden, ohne den Computer neu starten zu müssen?

+1

Haben Sie 'setsockopt' aufrufen, bevor Sie genannt' bind'? –

+0

@WaleedKhan Ja; Es ging direkt vor dem "Versuch". –

Antwort

0

Try this:
tcpkill -i eth0 port 43434

+0

Das Ausführen von tcpkill (das ist im Paket dsniff, btw) hängt nur an 'tcpkill: lauscht auf eth0 [port 43434]'. Ich habe versucht, es mit "-9" auszuführen, dasselbe. –

+0

Ich versuchte auch 'cxkill' zu verwenden, der keine Verbindungen auf diesem Port meldete. Und ich versuche 'cutter' zu verwenden, aber [es gibt Probleme] (http://stackoverflow.com/q/11581814/120999), die das auf CentOS laufen lassen. –

0

Sie könnten versuchen, SO_REUSEPORT Socket-Optionen einzustellen. Das funktioniert aber nur, wenn der Konflikt verursachende Socket auch die SO_REUSEPORT-Optionen hatte, bevor er gebunden wurde. Sie sollten es also nach einem sauberen Neustart versuchen.

Sie haben jedoch gesagt, dass Ihr Python-Code wie der von Ihnen gepostete Code aussieht. Haben Sie tatsächlich eine sehr vereinfachte Version Ihres Programms ausprobiert, um nur die Bindung zu testen?

Sie können auch versuchen, Ihr Programm zu straffen.

1

Ich wollte einen Kommentar hinzufügen, aber es wird mich nicht tun lassen. also muss ich auf diese Weise antworten. Meiner Erfahrung nach musste ich folgendes tun, um mit Erfolg Sockets zu bekommen. Ich musste das Zeitlimit explizit selbst festlegen.

In Ihrem Code vor dem Öffnen des Sockets sollten Sie dies festlegen, wenn Sie Python Version 2.3 oder höher verwenden. Ich beginne normalerweise mit einer Zeitüberschreitung von 30 Sekunden und stelle dann ein, was für eine bestimmte Website funktioniert. Wenn ich diesen Parameter nicht verwende, erhalte ich Flocke-Probleme.

socket.setdefaulttimeout(timeout) 

Andere Probleme Ich habe nach dem offenen getan werden einige der folgenden Ausnahmen fangen:

  except socket.gaierror, err: 
       # you might want to handle this 
      except socket.sslerror, err2: 
       # you might want to handle this if doing SSL 
Verwandte Themen