Una vez establecida la conexión, si ningún par envía datos, no se envía ningún paquete por la red. TCP es un protocolo inactivo, por lo que asume que la conexión sigue activa.
Puede intentar abrir una segunda conexión e intentar conectarse, pero esto tiene algunas desventajas: consume más recursos, crea nuevos hilos, etc. Además, si el otro extremo ha reiniciado, la segunda conexión funcionará pero la primera no.
Si intenta enviar un ping o cualquier mensaje con una conexión semiabierta, verá que no recibe ningún error.
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 para 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 en el extremo remoto de una conexión sigue disponible. Los TCP keep-alives pueden enviarse una vez cada TCPKeepAlive.Time (por defecto 7.200.000 milisegundos o dos horas) si no se han transportado otros datos o keep-alives de nivel superior por la conexión TCP. Si no hay respuesta a un keep-alive, se repite una vez cada TCPKeepAlive.Interval segundos. KeepAliveInterval tiene por defecto 1000 milisegundos.
Puede habilitar KeepAlive por conexión y permitir que el protocolo TCP compruebe si la conexión está activa o no. Este es el método preferido si desea detectar desconexiones caídas (por ejemplo: cuando desconecta un cable de red).
oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;