2010-12-27 2 views
1

Ich habe einen Server mit ein paar Clients verbunden. Wenn STRG + C gedrückt wird (dh der Reaktor wird heruntergefahren), möchte ich alle meine Verbindungen schließen, warten, bis sie sauber geschlossen sind, und dann anhalten. Ich mache das, indem ich die Transporte der verbundenen Kunden durchführe und .loseConnection() anrufe. Bei denjenigen, die lokal verbunden sind, trennen sie sich sofort. Bei einem, der über das Internet verbunden ist, ist die Verbindung jedoch nicht sofort verloren. Die Kommunikation stoppt - und das Schließen des Client-Programms sagt dem Server nicht einmal mehr, dass die Verbindung gestorben ist, obwohl es vor dem Aufruf .loseConnection() - aber die Verbindung wird nicht als 'verloren' bis ein paar Minuten später, nachdem ich ein paar Heartbeat-Anfragen von der gesendet Server.twisted .loseConnection verliert nicht sofort die Verbindung?

Ich verstehe, dass, wenn eine Verbindung stirbt, es keine Möglichkeit für den Server zu wissen gibt, es sei denn, es versucht, einige Daten zu senden. Aber wenn ich konkret nach einer Verbindung frage, die geschlossen werden soll, warum schließt sie dann nicht sofort? Rufe ich die falsche Funktion an?

Antwort

1

loseConnection löscht den Schreibpuffer vor dem Herunterfahren der Verbindung. Wenn Sie nicht darauf warten wollen, lassen Sie den Reaktor einfach anhalten. Sie werden auf diese Weise geschlossen, wobei nicht gesendete Daten in ihrem Schreibpuffer verworfen werden.

Es gibt auch einen Vorschlag zum Hinzufügen einer API zum Verwerfen des Schreibpuffers und Trennen der Verbindung, abortConnection.

+0

ich will den reaktor noch nicht herunterfahren, ich möchte die verbindung einfach abbrechen. also gibt es keinen aktuellen Weg, dies zu tun? – Claudiu

+0

Ich dachte, du wolltest den Reaktor herunterfahren, weil du von Ctrl-C sprichst. Für den Fall, dass der Reaktor nicht heruntergefahren wird, muss abortConnection (oder etwas Ähnliches) implementiert werden. Sie können wahrscheinlich auch einen Weg finden, private/undokumentierte Methoden (wie 'transport.connectionLost') zu verwenden, aber diese werden nicht immer unterstützt. –