Sobald die Verbindung hergestellt ist, werden keine Pakete über das Netz gesendet, wenn kein Peer Daten überträgt. TCP ist ein passives Protokoll und geht davon aus, dass die Verbindung aktiv ist.
Gründe für Verbindungsabbrüche- Anwendung schließt: Wenn ein Prozess beendet wird, sendet er normalerweise ein FIN-Paket, das den anderen Peer darüber informiert, dass die Verbindung geschlossen wurde. Stürzt ein Prozess jedoch ab, gibt es keine Garantie, dass dieses Paket beim anderen Peer ankommt.
- Gerät schaltet sich aus: Schaltet sich das Gerät aus, gibt es höchstwahrscheinlich keine Benachrichtigung darüber.
- Netzwerkkabel abgezogen: Wird das Netzwerkkabel abgezogen, ist das dasselbe wie wenn ein Router heruntergefahren wird - es werden keine Daten übertragen, also wird die Verbindung nicht geschlossen.
- Signalverlust vom Router: Verliert die Anwendung das Signal vom Router, bleibt die Verbindung trotzdem aktiv.
Halb offene Verbindungsabbrüche erkennen
Du kannst versuchen, Verbindungsabbrüche mit den folgenden Methoden zu erkennen
Zweite Verbindung
Du kannst versuchen, eine zweite Verbindung zu öffnen, aber das hat einige Nachteile: Du verbrauchst mehr Ressourcen, legst neue Threads an... und wenn der andere Peer neu gestartet wurde, funktioniert die zweite Verbindung, aber die erste nicht.
Anderen Peer pingenVersuchst du, einen Ping oder eine beliebige Nachricht über eine halb offene Verbindung zu senden, siehst du, dass kein Fehler auftritt.
KeepAlive auf TCP-Socket-Ebene aktivierenEin TCP-Keep-Alive-Paket ist einfach ein ACK mit einer Sequenznummer, die um eins kleiner ist als die aktuelle Sequenznummer der Verbindung. Ein Host, der so ein ACK empfängt, antwortet mit einem ACK für die aktuelle Sequenznummer. Keep-Alives können verwendet werden, um zu überprüfen, ob der Rechner am Remote-Ende einer Verbindung noch verfügbar ist. TCP-Keep-Alives können alle TCPKeepAlive.Time gesendet werden (Standard: 7.200.000 Millisekunden bzw. zwei Stunden), wenn keine anderen Daten oder Keep-Alives höherer Ebenen über die TCP-Verbindung gelaufen sind. Gibt es keine Antwort auf ein Keep-Alive, wird es einmal alle TCPKeepAlive.Interval-Sekunden wiederholt. KeepAliveInterval steht standardmäßig auf 1000 Millisekunden.
Du kannst KeepAlive pro Verbindung aktivieren und das TCP-Protokoll prüfen lassen, ob die Verbindung aktiv ist oder nicht. Das ist die bevorzugte Methode, wenn du abgebrochene Verbindungen erkennen willst (zum Beispiel beim Abziehen eines Netzwerkkabels). Ab sgcWebSockets 4.3.7 kannst du die Eigenschaft TCPKeepAlive aktivieren, um solche halb offenen Verbindungen zu erkennen.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
