TsgcWebSocketClient | Dropped Disconnections

Po nawiązaniu połączenia, jeśli żaden peer nie wysyła żadnych danych, przez sieć nie są przesyłane żadne pakiety. TCP jest protokołem bezczynnym, dlatego zakłada, że połączenie jest nadal aktywne.

Przyczyny rozłączenia

 

Wykrywanie połączeń w stanie półotwartym

Rozłączenia można próbować wykryć przy użyciu następujących metod

Drugie połączenie

Można spróbować otworzyć drugie połączenie i podjąć próbę nawiązania go, jednak rozwiązanie to ma pewne wady: zużywa więcej zasobów, tworzy nowe wątki itp. Ponadto, jeśli drugi peer został zrestartowany, drugie połączenie będzie działać, ale pierwsze nie.

Wyślij ping do drugiego peera

Przy próbie wysłania ping lub jakiejkolwiek wiadomości przez połączenie w stanie half-open nie zostanie zwrócony żaden błąd.

 

Włącz KeepAlive na poziomie gniazda TCP

Pakiet TCP keep-alive to po prostu ACK z numerem sekwencji ustawionym o jeden mniej niż bieżący numer sekwencji połączenia. Host odbierający jedno z tych ACK odpowiada ACK dla bieżącego numeru sekwencji. Pakiety keep-alive mogą być używane do weryfikacji, czy komputer na zdalnym końcu połączenia jest nadal dostępny. Pakiety TCP keep-alive mogą być wysyłane raz na TCPKeepAlive.Time (domyślnie 7 200 000 milisekund, czyli dwie godziny), jeśli przez połączenie TCP nie były przesyłane inne dane ani pakiety keep-alive wyższego poziomu. Jeśli nie ma odpowiedzi na keep-alive, jest on powtarzany co TCPKeepAlive.Interval sekund. KeepAliveInterval domyślnie wynosi 1000 milisekund.

 

Można włączyć funkcję KeepAlive dla poszczególnych połączeń i umożliwić protokołowi TCP sprawdzanie, czy połączenie jest aktywne. Jest to preferowana metoda, gdy wymagane jest wykrywanie zerwanych połączeń (na przykład: przy odłączeniu kabla sieciowego).

 


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