2016-05-27 2 views
2

Während Codierung Socket-Client/Server, ich habe gedacht, um HeartBeat zu implementieren, um zu wissen, ob der Client lebt, aber dann nach anderen Möglichkeiten gesucht und entdeckte dieses Stück Code, der genau das aus Beschreibung zu tun scheint:Wie funktioniert die Socket Keep-Alive-Erweiterung? C#

Es scheint die Arbeit in einer viel einfacheren Weise als die Implementierung eines HeartBeat zu tun, obwohl ich nicht ganz verstehe, wie es funktioniert, scheint etwas mit unmanaged Code zu tun? Und wenn ja, warum?

Eine Erklärung würde geschätzt werden, danke!

Antwort

1

KeepAlive ist Teil des TCP-Protokolls. Durch Aktivieren von KeepAlive sendet das Betriebssystem regelmäßig leere Pakete an die andere Partei und wartet auf eine ACK. Wenn innerhalb der erforderlichen Zeitüberschreitung kein ACK empfangen wird, wird angenommen, dass die Verbindung unterbrochen ist, und die Anwendung kann benachrichtigt werden.

KeepAlive ist jedoch normalerweise nicht erforderlich, es sei denn, Sie haben einen Nur-Empfang-Socket oder Ihre Verbindung wird für längere Zeit im Leerlauf sein.

In einem Empfangs-Socket senden Sie keine Daten, daher ist die einzige Möglichkeit, eine unterbrochene Verbindung zu erkennen, ein Null-Paket zu senden und auf ACK zu warten.

Wenn OTOH Sie einen bidirektionalen Socket haben, überprüfen Sie bei jedem Senden von Daten an die andere Partei im Wesentlichen auch, ob die Verbindung unterbrochen wurde, sodass KeepAlive nicht benötigt wird. Beachten Sie, dass Sie, wenn Sie Daten nur als Antwort senden, wenn das andere Ende Daten sendet, KeepAlive immer noch benötigen, da Sie möglicherweise nie zum "sendenden" Teil Ihres Protokolls gelangen.

Wie von Remy Lebeau in seinem Kommentar angemerkt, kann eine Verbindung, die für längere Zeit im Leerlauf sein kann, KeepAlive erfordern, da einige Router/Firewalls nach einer Weile ungenutzte Verbindungen schließen.

+1

"* KeepAlive ist jedoch nur erforderlich, wenn Sie einen reinen Empfangssockel haben *" - das ist nicht wahr. Es gibt andere Gründe für die Verwendung von Keepalive, z. B. das Beibehalten einer Verbindung, solange sie längere Zeit inaktiv ist (denken Sie an eine FTP-Befehlsverbindung, die während einer längeren Übertragung auf einer Datenverbindung inaktiv ist). Einige Router/Firewalls schließen ungenutzte Verbindungen nach einiger Zeit, so dass Keepalive dazu verwendet werden kann. –

+0

@RemyLebeau: Du hast recht, danke, dass du es angesprochen hast. Ich habe meine Antwort der Vollständigkeit halber bearbeitet –