it-swarm.com.de

Python [Errno 98] Adresse wird bereits verwendet

In meinem Python-Socket-Programm muss ich es manchmal mit unterbrechen Ctrl-C. Wenn ich das tue, wird die Verbindung mit socket.close() geschlossen.

Wenn ich jedoch versuche, es wieder zu öffnen, muss ich eine Minute warten, bevor ich wieder eine Verbindung herstellen kann. Wie schließt man eine Steckdose richtig? Oder ist das beabsichtigt?

75
skylerl

Ja, es ist beabsichtigt. Hier können Sie ausführliche Erklärung lesen. Dieses Verhalten kann durch Setzen der Option SO_REUSEADDR für einen Socket überschrieben werden. Zum Beispiel:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
96
Bartosz
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211
21
ayoub laaziz

Wenn Sie einen TCPServer, einen UDPServer oder dessen Unterklassen im SocketServer-Modul verwenden, können Sie diese Klassenvariable festlegen (vor dem Instanziieren eines Servers)

SocketServer.TCPServer.allow_reuse_address = True

(via SocketServer.ThreadingTCPServer - Kann nicht an die Adresse gebunden werden, nachdem das Programm neu gestartet wurde )

Dies bewirkt, dass init (Konstruktor):

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
15
dirkk0

Nichts hat für mich funktioniert, außer einen Subprozess mit diesem Befehl auszuführen, bevor HTTPServer (('', 443), myHandler) aufgerufen wird:

töte -9 $ (lsof -ti tcp: 443)

Natürlich ist dies nur für Linux-ähnliche Betriebssysteme!

2
Mirko

Eine einfache Lösung, die für mich funktioniert hat, ist das Terminal zu schließen und neu zu starten.

2

Habe den gleichen Fehler:
Schritte befolgt:
1 - gebraucht $ ps -fA | grep python
2 - Beendet den gesamten Prozess
3 - Geschlossenes Terminal
4 - relaunchte und startete die Anwendung (mkchromecast).
5 - Diese Fehlermeldung wurde nicht angezeigt.

Ich habe ein anderes Problem. das weiterverfolgen.

0
vb217

weil Sie versuchen, den Dienst in demselben Port auszuführen, der bereits ausgeführt wird.

dies geschieht manchmal, weil Ihr Dienst nicht im Prozessstack angehalten wird. Du musst sie töten

hier ist der einzeilige Befehl, um alle laufenden Python-Prozesse zu beenden.

für Linux-basiertes Betriebssystem:

kill -9 (ps -A | grep python | awk '{print $1}')
0
MohitGhodasara