TsgcWebSocketClient | Dropped Disconnections

Sobald die Verbindung hergestellt wurde, werden, wenn kein Peer Daten sendet, keine Pakete über das Netz gesendet. TCP ist ein Idle-Protokoll, daher nimmt es an, dass die Verbindung noch aktiv ist.

Trennungsgründe

 

Halb-offene Trennungen erkennen

Sie können versuchen, Trennungen mit den folgenden Methoden zu erkennen

Zweite Verbindung

Sie können versuchen, eine zweite Verbindung zu öffnen und einen Verbindungsversuch zu unternehmen, aber dies hat einige Nachteile: Sie verbrauchen mehr Ressourcen, erstellen neue Threads usw. Außerdem, wenn der andere Peer neu gestartet wurde, wird die zweite Verbindung funktionieren, aber die erste nicht.

Anderen Peer pingen

Wenn Sie versuchen, einen Ping oder eine beliebige Nachricht mit einer halboffenen Verbindung zu senden, werden Sie feststellen, dass Sie keinen Fehler erhalten.

 

KeepAlive auf TCP-Socket-Ebene aktivieren

Ein TCP-Keep-Alive-Paket ist einfach ein ACK mit der Sequenznummer, die auf eins weniger als die aktuelle Sequenznummer für die Verbindung gesetzt ist. Ein Host, der eines dieser ACKs empfängt, antwortet mit einem ACK für die aktuelle Sequenznummer. Keep-Alives können verwendet werden, um zu überprüfen, ob der Computer am entfernten Ende einer Verbindung noch verfügbar ist. TCP-Keep-Alives können einmal alle TCPKeepAlive.Time (Standard 7.200.000 Millisekunden oder zwei Stunden) gesendet werden, wenn keine anderen Daten oder höherstufigen Keep-Alives über die TCP-Verbindung übertragen wurden. Wenn keine Antwort auf ein Keep-Alive erfolgt, wird es einmal alle TCPKeepAlive.Interval Sekunden wiederholt. KeepAliveInterval ist standardmäßig 1000 Millisekunden.

 

Sie können KeepAlive pro Verbindung aktivieren und dem TCP-Protokoll erlauben, zu prüfen, ob die Verbindung aktiv ist oder nicht. Dies ist die bevorzugte Methode, wenn Sie unterbrochene Verbindungen erkennen möchten (zum Beispiel: wenn Sie ein Netzwerkkabel ziehen).

 


oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;