2012-04-05 5 views
2

Ich habe einen asynchronen TCP/IP-Client mit Asio. Wenn die Verbindung unterbrochen wird, erhält meine Handle-Funktion von async_read einen Fehler. Ich bin informiert, dass eine Verbindung verloren gegangen ist.Boost Asio: Wie zu überwachen, dass eine TCP-Verbindung ist lebendig

Jetzt refactoring ich einige Legacy-Codes, die einen synchronen TCP/IP-Client implementieren, wo die abstrakte Schnittstelle diese Sequenz erzwingt: ein synchrones Schreiben, dann ein synchrones Lesen. Das mit Asio zu tun ist ziemlich einfach, aber ich würde gerne asynchron wissen, wenn die Verbindung verloren ist.

Gibt es eine elegantere Möglichkeit als:

A Option: hinzufügen einen Thread, wenn der Socket prüft noch am Leben ist (durch zu lesen versuchen ... aber wie kann ich sicher sein, dass die Lese keine Daten von meinem synchronen Lese stehlen Siehe Boost asio ip tcp iostream Error Detection)

Option B: Verwenden async_read statt und und emulieren eine synchrone

lesen
+0

Ich denke, die Antwort ist nein. Vielleicht gibt es jedoch einige plattformspezifische Lösungen. – mirk

+0

Ich glaube nicht, dass das TCP-Protokoll einen Verbindungsfehler erkennen kann, wenn es nicht innerhalb eines bestimmten Zeitrahmens eine Bestätigung an gesendete Pakete empfängt. – Ferruccio

+0

Ich habe Option B implementiert. Aber, es gibt 2 Dinge, die ich nicht verstehe 1. Verbindungsabbrüche werden nicht erkannt und 2. Wenn ich das Ethernetkabel des Servers herausgezogen habe (das ist ein Drucker), kann ich immer noch Daten senden und es gibt keinen Fehler zurück. Nur das zweite Mal, wird es einen Fehler – DoogQc

Antwort

2

ich könnte mir vorstellen, dass die syn die chronologische Operation würde genauso versagen wie die asynchrone. Es kann jedoch störender sein, wenn das synchrone Programm fehlschlägt, da das Timeout sehr lang und viel auffälliger sein kann, wenn alles andere darauf warten muss.

Sie könnten prüfen, ob TCP-Keep-Alives auf Ihrem Socket aktiviert werden, und möglicherweise das TCP Keep Alive-Intervall verringern, um eine verlorene Verbindung schneller zu erkennen.

+0

erwähnenswert; TCP-keepalive hat einige Einschränkungen, vor allem gibt es meines Wissens keine Möglichkeit, das Timeout des Keepalives zu ändern. Außerdem sind die Standardzeitlimits ziemlich groß. Unter Linux beträgt das standardmäßige Keepalive-Intervall beispielsweise 2 Stunden, und 9 Probes müssen fehlschlagen, bevor die Verbindung als tot gilt. – Rawler

+0

Die Essenz besteht darin, dass Sie in den meisten Fällen darauf achten müssen, das Verbindungstimeout selbst in Ihrem Anwendungscode zu behandeln, dem Protokoll möglichst "Heartbeat" -Überprüfungen hinzuzufügen und sinnvolle Standardwerte für Zeitüberschreitungen zu berechnen. ("Sollte diese Operation wirklich jemals 5 Sekunden dauern?", Etc.) – Rawler