Der Python-Socket schließt die Verbindung nicht richtig

7

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

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

Auf meiner Linux-Box habe ich ein kleines Python-Skript geschrieben, um den Socket zum win prog zu bringen. Das funktioniert gut, bis ich mein Prog auf Linux töte. Der anfängliche Server-Socket wird nicht wie angegeben geschlossen und ich kann mein Programm nicht neu starten, bis der Socket nicht mehr benötigt wird.

Wenn ich das gleiche mit einem Linux-Socket (in einem separaten Python-Skript) versuche, habe ich keine Probleme.

Hier ist ein minimales Codebeispiel:

%Vor%

Wenn ich dies mit Strg-C abbringe, wird es normal beendet. Aber beim Neustart des Skripts bekomme ich einen socket.error, der besagt, dass die Adresse bereits benutzt wird. Nach einer Minute oder so funktioniert das Programm wieder.

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

Gibt es einen besseren "richtigen" Weg, einen Windows Socket zu schließen? Vermissen Sie etwas grundsätzliches über Steckdosen im Allgemeinen?

Danke!

edit: Ich denke, ich habe gerade die Antwort hier gesehen: Was ist der richtige Weg? Schließen Sie einen Socket in Python 2.6?

Obwohl ich Python 2.5 benutze, könnte es immer noch funktionieren.

    
BandGap 18.02.2011, 11:02
quelle

2 Antworten

25

Sie haben den Status TIME_WAIT der verbundenen Sockets. Obwohl Sie Ihre Steckdose geschlossen haben, hat es noch einige Minuten anhaltende Folgen. Die Gründe dafür sowie ein Socket-Flag, das Sie festlegen können, um das Verhalten zu deaktivieren (SO_REUSEADDR), werden in der erläutert Häufig gestellte Fragen zu UNIX-Führungssockets .

Kurz gesagt,

%Vor%     
Jean-Paul Calderone 18.02.2011, 14:11
quelle
2

Fügen Sie import sys hinzu und beenden Sie Ihre App mit sys.exit (). Der Socket bleibt reserviert, bis das System davon überzeugt ist, dass die Anwendung geschlossen ist. Das können Sie mit sys.exit ()

explizit sagen

[Bearbeiten] Oh, ok. Ich bin selbst ziemlich neu in Sockeln. Du sagst also, dass diese Sequenz nicht sicher ist? Ich kann mir keinen anderen Weg vorstellen. Du musst deine App irgendwann schließen, mit etwas Technik, oder? Wie ist es dann richtig gemacht?

%Vor%     
Alan 18.02.2011 11:33
quelle