TCP half-open verbindingen

· Functies

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

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 peer

Als 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-socketniveau

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