Una volta stabilita la connessione, se nessun peer invia dati, non vengono inviati pacchetti in rete. TCP è un protocollo passivo, quindi presuppone che la connessione sia ancora attiva.
È possibile tentare di aprire una seconda connessione e provare a connettersi, ma ciò presenta alcuni svantaggi: si consumano più risorse, si creano nuovi thread, ecc. Inoltre, se l'altro peer ha riavviato, la seconda connessione funzionerà ma la prima no.
Se si tenta di inviare un ping o qualsiasi altro messaggio con una connessione half-open, si noterà che non viene ricevuto alcun errore.
Un pacchetto TCP keep-alive è semplicemente un ACK con il numero di sequenza impostato a uno in meno rispetto al numero di sequenza corrente per la connessione. Un host che riceve uno di questi ACK risponde con un ACK per il numero di sequenza corrente. I keep-alive possono essere utilizzati per verificare che il computer all'estremità remota di una connessione sia ancora disponibile. I TCP keep-alive possono essere inviati ogni TCPKeepAlive.Time (predefinito 7.200.000 millisecondi o due ore) se non sono stati trasmessi altri dati o keep-alive di livello superiore sulla connessione TCP. Se non vi è risposta a un keep-alive, viene ripetuto ogni TCPKeepAlive.Interval secondi. KeepAliveInterval è predefinito a 1000 millisecondi.
È possibile abilitare KeepAlive per connessione e consentire al protocollo TCP di verificare se la connessione è attiva o meno. Questo è il metodo preferito se si desidera rilevare disconnessioni improvvise (ad esempio: quando si scollega un cavo di rete).
oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;