Una volta stabilita la connessione, se nessun peer invia alcun dato, nessun pacchetto viene inviato sulla rete. TCP è un protocollo idle, quindi assume che la connessione sia attiva.
Disconnection reasons- Application closes: quando un processo termina, di solito invia un pacchetto FIN che notifica all'altro peer che la connessione è stata chiusa. Ma se un processo crasha non c'è alcuna garanzia che questo pacchetto venga inviato all'altro peer.
- Device Closes: se il dispositivo si chiude, molto probabilmente non ci sarà alcuna notifica al riguardo.
- Network cable unplugged: se il cavo di rete viene scollegato è lo stesso che il router si chiude, non ci sono dati in trasferimento quindi la connessione non viene chiusa.
- Loss signal da router: se l'applicazione perde il segnale dal router, la connessione resta comunque attiva.
Detect Half-Open Disconnections
You può try a rilevare disconnections utilizzando il seguente methods
Second Connection
You può try a apre a secondo connessione e try a connetti ma questo presenta alcuni svantaggi, come consumare più risorse, creare nuovi thread... e se l'altro peer ha effettuato il reboot, la seconda connessione funzionerà ma la prima no.
Ping altro peerIf provi a inviare a ping o whatever messaggio con a connessione half-open, vedrai che non ottieni alcun errore.
Enable KeepAlive a TCP Socket levelA TCP keep-alive pacchetto è semplicemente an ACK con il sequence number impostare a uno less than il corrente sequence number per la connessione. Un host che riceve uno di questi ACK risponde con un ACK per il sequence number corrente. I keep-alive possono essere utilizzati per verificare che il computer all'estremità remota di una connessione sia ancora disponibile. TCP keep-alives può essere inviato once ogni TCPKeepAlive.Time (predefinito 7.200.000 millisecondi, ovvero due ore) se nessun altro dato o keep-alive di livello superiore è stato trasportato sulla connessione TCP. Se non c'è risposta a un keep-alive, viene ripetuto una volta ogni TCPKeepAlive.Interval secondi. KeepAliveInterval ha valore predefinito 1000 millisecondi.
You può abilitare per-connection KeepAlive e consentire che TCP protocol verifica se connessione è active o not. Questo è il metodo preferito se vuoi rilevare disconnessioni cadute (ad esempio: quando scolleghi un cavo di rete). Da sgcWebSockets 4.3.7 puoi abilitare la proprietà TCPKeepAlive per provare a rilevare queste connessioni half-open.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
