Conexões TCP Half-Open

· Recursos

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

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 peer

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

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