Conexiones TCP semiabiertas

· Features

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

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 extremo

Si 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 TCP

Un 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;