Zodra de verbinding tot stand is gebracht, worden er geen pakketten over het netwerk verstuurd als geen van de peers data verstuurt. TCP is een inactief protocol, dus het neemt aan dat de verbinding actief is.
Redenen voor verbreking- Applicatie sluit af: wanneer een proces is afgelopen, wordt meestal een FIN-pakket verstuurd dat de andere peer bevestigt dat de verbinding is gesloten. Maar als een proces crasht, is er geen garantie dat dit pakket naar de andere peer wordt verstuurd.
- Apparaat sluit af: als het apparaat afsluit, is er hoogstwaarschijnlijk geen melding hierover.
- Netwerkkabel losgekoppeld: als de netwerkkabel wordt losgekoppeld, is dat hetzelfde als wanneer een router afsluit; er wordt geen data overgedragen, dus de verbinding wordt niet gesloten.
- Signaalverlies van router: als de applicatie het signaal van de router verliest, blijft de verbinding actief.
Half-open verbindingen detecteren
Je kunt verbroken verbindingen proberen te detecteren met de volgende methoden
Tweede verbinding
Je kunt proberen een tweede verbinding te openen, maar dit heeft enkele nadelen, zoals dat je meer resources verbruikt, nieuwe threads aanmaakt... en als de andere peer opnieuw is opgestart, zal de tweede verbinding werken maar de eerste niet.
Ping de andere peerAls je probeert een ping of welk bericht dan ook te versturen met een half-open verbinding, krijg je geen foutmelding.
Schakel KeepAlive in op TCP-socketniveauEen TCP keep-alive-pakket is simpelweg een ACK met het sequentienummer op één minder dan het huidige sequentienummer voor de verbinding. Een host die zo'n ACK ontvangt, antwoordt met een ACK voor het huidige sequentienummer. Keep-alives kunnen worden gebruikt om te verifiëren of de computer aan het andere eind van een verbinding nog beschikbaar is. TCP keep-alives kunnen één keer per TCPKeepAlive.Time worden verstuurd (standaard 7.200.000 milliseconden of twee uur) als er geen andere data of hogere-niveau-keep-alives over de TCP-verbinding zijn verzonden. Als er geen antwoord komt op een keep-alive, wordt deze één keer per TCPKeepAlive.Interval seconden herhaald. KeepAliveInterval is standaard 1000 milliseconden.
Je kunt per-verbinding KeepAlive inschakelen en het TCP-protocol laten controleren of de verbinding actief is of niet. Dit is de voorkeursmethode als je verbroken verbindingen wilt detecteren (bijvoorbeeld: wanneer je een netwerkkabel loskoppelt). Vanaf sgcWebSockets 4.3.7 kun je de eigenschap TCPKeepAlive inschakelen om te proberen deze half-open verbindingen te detecteren.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
