Python-Buchse schließt die Verbindung nicht ordnungsgemäß

Ich bin neu in Socket-Programmierung und lief in ein rätselhaftes Problem:

Ich habe ein Windows-Programm, das ich nicht ändern kann (proprietäre Software), aber das versucht, eine Verbindung zu einem bestimmten ip und Port mit einem tcp-Socket zu verbinden.

Auf meinem Linux-Kasten schrieb ich ein kleines Python-Skript, um den Sockel zum Gewinnprog zu dienen. Das funktioniert gut, bis ich mein prog auf linux töte. Die ursprüngliche Server-Steckdose schließt nicht wie angegeben und ich kann mein Programm nicht neu starten, bis die Steckdose Müll gesammelt ist.

Wenn ich das mal mit einem Linux-Sockel ausprobiere (in einem separaten Python-Skript) habe ich keine Probleme.

Hier ist ein minimales Codebeispiel:

import socket server = socket.socket() server.bind(('192.168.0.111', 50001)) server.listen(1) conn, addr = server.accept() print 'Connection established' running = True while running: try: data = conn.recv(4096) except KeyboardInterrupt: conn.close() running = False else: if data: print data else: conn.close() running = False server.close() 

Wenn ich das mit Ctrl-C töte, geht es normal aus. Aber beim Neustart des Skripts bekomme ich einen Socket.error, der angibt, dass die Adresse bereits benutzt wird. Nach einer Minute läuft das Programm wieder.

Ich habe auch versucht, ein Shutdown vor dem Schließen (aka conn.shutdown (2) und server.shutdown …) aber das hat keine Wirkung.

Gibt es einen besseren "richtigen" Weg, um eine Fenster-Steckdose zu schließen? Vermisse ich etwas Grundsätzliches über Steckdosen im Allgemeinen?

Vielen Dank!

Edit: Ich glaube ich habe gerade die Antwort hier gesehen: Was ist der richtige Weg, um eine Steckdose in Python 2.6 zu schließen?

Obwohl ich python 2.5 verwende, kann es noch funktionieren

2 Solutions collect form web for “Python-Buchse schließt die Verbindung nicht ordnungsgemäß”

Sie erleben den TIME_WAIT Zustand der angeschlossenen Steckdosen. Auch wenn du deine Steckdose geschlossen hast, hat es immer noch anhaltende Konsequenzen für ein paar Minuten. Die Gründe dafür, sowie ein Socket-Flag, das du einstellen kannst, um das Verhalten zu deaktivieren (SO_REUSEADDR), werden im UNIX-Guide Socket FAQ erklärt .

Zusamenfassend,

 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

Versuchen Sie das Hinzufügen von Import-Sys und beenden Sie Ihre App mit sys.exit (). Die Steckdose bleibt reserviert, bis das System zufrieden ist, dass die Anwendung geschlossen ist. Sie können das mit sys.exit explizit ()

[Bearbeiten] Oh, ok. Ich bin mir ziemlich schön zu den Sockeln. Also sagst du, dass diese Sequenz nicht sicher ist? Ich kann mir keine andere Möglichkeit vorstellen, es zu tun. Du musst deine App irgendwann schließen, mit einer Technik, richtig? Wie ist es dann richtig gemacht?

 server.shutdown(socket.SHUT_RDWR) server.close() sys.exit() 
  • Hilfe mit py2exe Fehler
  • Übergeben eines Dateideskriptors an eine C-Bibliotheksfunktion über Ctypes auf Fenstern
  • Anruffunktionen aus re-
  • Entsagte auf Windows mit Kerberos funktioniert nicht
  • Wie erstelle ich Celery Windows Service?
  • Python 2.6 unter Windows: wie man subprocess.Popen mit "shell = True" Argument beenden?
  • Umbenennen von mehreren Dateien auf der Grundlage von Dokument Text String
  • Python-Skript funktioniert nicht mit Doppelklick
  • Falsch, um Flasche unter virutalenv auf Windows installieren - [Fehler 2] Das System kann die angegebene Datei nicht finden
  • Wie installiere ich setuptools für python 2.6 unter Windows?
  • Python: strftime () UTC Offset funktioniert nicht wie erwartet in Windows
  • Python ist die beste Programmiersprache der Welt.