Połączenia TCP w stanie half-open

· Funkcje

Po nawiązaniu połączenia, jeśli żaden peer nie wysyła danych, w sieci nie są przesyłane żadne pakiety. TCP to protokół typu idle, więc zakłada, że połączenie jest aktywne.

Powody rozłączeń

Wykrywanie rozłączeń half-open 

Możesz spróbować wykryć rozłączenia, korzystając z następujących metod 

Drugie połączenie

Możesz otworzyć drugie połączenie i spróbować się połączyć, ale ma to pewne wady — zużywasz więcej zasobów, tworzysz nowe wątki... i jeśli drugi peer został zrestartowany, drugie połączenie zadziała, a pierwsze nie.

Ping drugiego peera

Jeśli spróbujesz wysłać ping lub jakąkolwiek wiadomość w stanie half-open, zobaczysz, że nie dostaniesz żadnego błędu.

Włącz KeepAlive na poziomie gniazda TCP

Pakiet TCP keep-alive to po prostu ACK z numerem sekwencyjnym ustawionym na jeden mniej niż bieżący numer sekwencyjny połączenia. Host, który otrzyma jeden z tych pakietów ACK, odpowiada pakietem ACK z bieżącym numerem sekwencyjnym. Keep-alive można wykorzystać, aby zweryfikować, czy komputer po drugiej stronie połączenia jest nadal dostępny. Pakiety TCP keep-alive mogą być wysyłane co TCPKeepAlive.Time (domyślnie 7 200 000 milisekund, czyli dwie godziny), jeśli przez połączenie TCP nie były przesyłane żadne inne dane ani keep-alive wyższego poziomu. Jeśli nie ma odpowiedzi na keep-alive, jest on powtarzany co TCPKeepAlive.Interval sekund. KeepAliveInterval ma domyślną wartość 1000 milisekund.

Możesz włączyć KeepAlive dla każdego połączenia i pozwolić protokołowi TCP sprawdzać, czy połączenie jest aktywne. To preferowana metoda, jeśli chcesz wykrywać zerwane połączenia (na przykład gdy odłączysz kabel sieciowy). Od wersji sgcWebSockets 4.3.7 możesz włączyć właściwość TCPKeepAlive, aby wykrywać takie połączenia half-open.

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