Beim Lesen anderer Stack Overflow-Einträge und der Dokumentation boost::asio
habe ich bestätigt, dass es keine synchronen ASIO-Lese-/Schreibaufrufe gibt, die auch ein benutzerfreundliches Timeout als Parameter für den Anruf bereitstellen.C++ Boost ASIO: Wie man mit einem Timeout liest/schreibt?
Ich bin mitten in der Umwandlung einer alten Schule Linux-Socket-Anwendung mit Select (2) Anrufe, Timeouts verwendet, und ich muss mehr oder weniger das gleiche tun.
Was ist der beste Weg, dies in boost::asio
zu tun? Wenn man sich die Asio-Dokumentation anschaut, gibt es viele verwirrende Beispiele für verschiedene Dinge, die mit Timern zu tun haben, aber ich bin ziemlich verwirrt.
Ich würde gerne ein einfach zu lesendes Beispiel dafür sehen: Lesen von einem Sockel, aber warten Sie für ein Maximum von X Sekunden nach dem die Funktion entweder mit nichts zurückkehrt, oder mit allem zurückkommt, was es konnte aus dem Socket zu lesen, bevor das Timeout abgelaufen ist.
Können Sie bitte erläutern, was an diesem Beispiel verwirrend ist: http://think-async.com/Asio/asio-1.4.7/src/examples/timeouts/blocking_tcp_client.cpp - Die wesentliche Logik ist, dass Sie 2 asynchrone Tasks absetzen, einen einen Lese-/Schreibzugriff und den anderen eine Zeitüberschreitung, wenn der Lese-/Schreibzugriff zuerst beendet wird, wenn der Deadline-Timer beendet wird, wenn der Deadline-Timer die Logik zurückgibt ist immer noch herausragend - von da an geht es mit Ihrer Timeout-Logik weiter. sehr, sehr einfach. –
Es gibt einen Eckfall, der in Hf-Netzwerk auftreten kann, das mit der Warteschlange der Rückrufe verbunden ist. Die Zeitüberschreitung cb wird in die Warteschlange gestellt, dann wird das Lesen/Schreiben in die Warteschlange gestellt. Sie treffen die Zeitüberschreitung cb und beginnen mit der Ausführung der Zeitüberwachungslogik, wenn in Wirklichkeit das Lesen/Schreiben abgeschlossen ist. Eine mögliche Lösung, die ich gesehen habe, ist etwas Ähnliches wie die Doppelschecksperre - kurz eine sekundäre Zeitüberschreitung durchführen, wenn die erste Zeitüberschreitung eintritt. aber dann hat dies das gleiche Problem, wenn das Lesen/Schreiben in die Warteschlange gestellt wird, nachdem das 2. Timeout ist Warteschlange ... –
Denken Sie daran, ein Timeout ist eine harte Bedingung, Sie sagen, wenn ich etwas nicht in einer bestimmten Menge von bekommen Zeit, ich werde etwas Bestimmtes tun - das schließt die Tatsache ein, dass das Lesen/Schreiben bereits stattgefunden hat und auf dem Weg zu Ihnen ist, das ändert nichts an der Tatsache, dass Sie es noch nicht erhalten haben. –