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ń- Zamknięcie aplikacji: gdy proces się kończy, zwykle wysyła pakiet FIN, który potwierdza drugiemu peerowi, że połączenie zostało zamknięte. Jeśli jednak proces ulegnie awarii, nie ma gwarancji, że ten pakiet zostanie wysłany.
- Wyłączenie urządzenia: jeśli urządzenie się wyłączy, najprawdopodobniej nie będzie żadnego powiadomienia.
- Odłączenie kabla sieciowego: odłączenie kabla sieciowego działa tak samo jak wyłączenie routera — żadne dane nie są przesyłane, więc połączenie nie jest zamykane.
- Utrata sygnału z routera: jeśli aplikacja utraci sygnał z routera, połączenie nadal pozostaje aktywne.
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 peeraJeś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 TCPPakiet 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;
