Mein Code verwendet boost :: asio und io_service in einem einzigen Thread, um verschiedene Socket-Operationen durchzuführen. Alle Operationen sind asynchron und jeder Handler hängt von boost::system::error_code
(insbesondere boost::asio::error::operation_aborted
) ab, um das Ergebnis der Operation zu bestimmen.boost :: asio async-Handler, die nach Abbruch ohne Fehler aufgerufen wurden
Es funktioniert einwandfrei, bis ich die Logik geändert habe, um mehrere gleichzeitige Verbindungen zu machen und den schnellsten auszuwählen. Das heißt, wenn der erste async_read_some
Handler ausgelöst wird, storniere ich andere Sockets (shutdown, close - alles) und fahre mit dem aktuellen fort. In 95% der Fälle werden die Lese-Handler anderer Sockets mit dem Fehler operation_aborted aufgerufen. Manchmal werden diese Lese-Handler jedoch ohne Fehler aufgerufen und sagen mir, dass sie erfolgreich N Bytes empfangen haben.
Aber die Dokumentation für die Socket :: cancel() states:
Mit dieser Funktion werden alle ausstehenden asynchronen Verbindung, senden und empfangen Operationen unverzüglich zu beenden und die Handler für abgebrochen wird sich die übergeben werden
boost::asio::error::operation_aborted
Fehler.
Also, die Fragen: Kann ich wirklich auf den operation_aborted
Fehler im Produktionscode verlassen? Wenn ich kann, ist es ein Fehler in Asio von Boost 1.46.1? Wenn ich das nicht kann, gibt es dafür offizielle Dokumente?
Es scheint in Ihrem Fall, dass mehrere Handler "erfolgreich" waren, bevor der Abbruch aufgerufen wurde. Sie können sich darauf verlassen, dass das 'operation_aborted' an alle Handler übergeben wird, die noch nicht ausgeführt wurden (und auf den Aufruf warten). – Chad