Depois que a conexão é estabelecida, se nenhum peer enviar dados, nenhum pacote será enviado pela rede. TCP é um protocolo inativo, portanto assume que a conexão está ativa.
Motivos de desconexão- Aplicação fecha: quando um processo termina, geralmente envia um pacote FIN que notifica o outro peer de que a conexão foi encerrada. Mas se um processo travar, não há garantia de que esse pacote será enviado ao outro peer.
- Dispositivo fecha: se o dispositivo for desligado, provavelmente não haverá nenhuma notificação sobre isso.
- Cabo de rede desconectado: se o cabo de rede for desconectado, é o mesmo que um roteador fechar — nenhum dado está sendo transferido e a conexão não é encerrada.
- Perda de sinal do roteador: se a aplicação perder o sinal do roteador, a conexão ainda continuará ativa.
Detectar Desconexões Half-Open
Você pode tentar detectar desconexões usando os seguintes métodos.
Segunda Conexão
Você pode tentar abrir uma segunda conexão e tentar se conectar, mas isso tem algumas desvantagens, como consumo de mais recursos, criação de novas threads... e se o outro peer reiniciar, a segunda conexão funcionará, mas a primeira não.
Ping no outro peerSe você tentar enviar um ping ou qualquer mensagem com uma conexão half-open, verá que não receberá nenhum erro.
Habilitar KeepAlive no nível do socket TCPUm pacote TCP keep-alive é simplesmente um ACK com o número de sequência definido como um a menos do 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 outra extremidade de uma conexão ainda está disponível. Os keep-alives TCP podem ser enviados a cada TCPKeepAlive.Time (padrão 7.200.000 milissegundos ou duas horas) se nenhum outro dado ou keep-alive de nível superior tiver sido transmitido pela conexão TCP. Se não houver resposta a um keep-alive, ele é repetido a cada TCPKeepAlive.Interval segundos. KeepAliveInterval tem como 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. Este é o método preferido para detectar desconexões silenciosas (por exemplo: quando você desconecta um cabo de rede). A partir do sgcWebSockets 4.3.7 você pode habilitar a propriedade TCPKeepAlive para tentar detectar essas conexões half-open.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
