Depois que a conexão foi estabelecida, se nenhum peer enviar dados, então nenhum pacote é enviado pela rede. O TCP é um protocolo ocioso, então ele presume que a conexão ainda está ativa.
Você pode tentar abrir uma segunda conexão e tentar conectar, mas isto tem algumas desvantagens: você consome mais recursos, cria novas threads, etc. Além disso, se o outro peer tiver reiniciado, a segunda conexão funcionará, mas a primeira não.
Se você tentar enviar um ping ou qualquer mensagem com uma conexão half-open, você verá que não recebe nenhum erro.
Um pacote TCP keep-alive é simplesmente um ACK com o número de sequência definido como um a menos que o número de sequência atual da conexão. Um host que recebe um desses ACKs responde com um ACK para o número de sequência atual. Os keep-alives podem ser usados para verificar se o computador na extremidade remota de uma conexão ainda está disponível. Os TCP keep-alives podem ser enviados uma vez a cada TCPKeepAlive.Time (padrão de 7.200.000 milissegundos ou duas horas) se nenhum outro dado ou keep-alives de nível mais alto tiverem sido transportados pela conexão TCP. Se não houver resposta a um keep-alive, ele é repetido uma vez a cada TCPKeepAlive.Interval segundos. O KeepAliveInterval é por padrão 1000 milissegundos.
Você pode habilitar o KeepAlive por conexão e permitir que o protocolo TCP verifique se a conexão está ativa ou não. Este é o método preferido se você quiser detectar desconexões abruptas (por exemplo: quando você desconecta um cabo de rede).
oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;