Una vez establecida la conexión, si ningún extremo envía datos, no se envían paquetes por la red. TCP es un protocolo inactivo, por lo que asume que la conexión sigue activa.
Motivos de desconexión- La aplicación se cierra: cuando un proceso termina, normalmente envía un paquete FIN que notifica al otro extremo que la conexión se ha cerrado. Pero si el proceso falla, no hay garantía de que ese paquete llegue al otro extremo.
- El dispositivo se apaga: si el dispositivo se apaga, lo más probable es que no se envíe ninguna notificación al respecto.
- Cable de red desconectado: si se desconecta el cable de red, ocurre lo mismo que si el router se apaga: no se transfieren datos, así que la conexión no se cierra.
- Pérdida de señal del router: si la aplicación pierde la señal del router, la conexión seguirá viva.
Detectar desconexiones semiabiertas
Puedes intentar detectar desconexiones con los siguientes métodos
Segunda conexión
Puedes intentar abrir una segunda conexión, pero tiene inconvenientes: consumes más recursos, creas nuevos hilos... y si el otro extremo se ha reiniciado, la segunda conexión funcionará pero la primera no.
Hacer ping al otro extremoSi intentas enviar un ping o cualquier otro mensaje con una conexión semiabierta, verás que no obtienes ningún error.
Activar KeepAlive a nivel de socket TCPUn paquete TCP keep-alive es simplemente un ACK con el número de secuencia establecido en uno menos que el número de secuencia actual de la conexión. Un host que recibe uno de estos ACKs responde con un ACK para el número de secuencia actual. Los keep-alives pueden usarse para verificar que el equipo del otro extremo de la conexión sigue disponible. Los keep-alives TCP pueden enviarse cada TCPKeepAlive.Time (por defecto 7.200.000 milisegundos o dos horas) si no se ha transmitido ningún otro dato ni keep-alives de nivel superior por la conexión TCP. Si no hay respuesta a un keep-alive, se repite cada TCPKeepAlive.Interval segundos. KeepAliveInterval tiene un valor por defecto de 1000 milisegundos.
Puedes activar KeepAlive por conexión y permitir que el protocolo TCP compruebe si la conexión está activa. Este es el método preferido si quieres detectar desconexiones inesperadas (por ejemplo, al desconectar un cable de red). Desde sgcWebSockets 4.3.7 puedes activar la propiedad TCPKeepAlive para intentar detectar estas conexiones semiabiertas.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
