私のコードは、シングルスレッドでboost :: asioとio_serviceを使用してさまざまなソケット操作を実行します。すべての操作は非同期であり、すべてのハンドラは操作の結果を判断するためにboost::system::error_code
(特にboost::asio::error::operation_aborted
)に依存します。boost :: asioキャンセル後にエラーなしで呼び出されるasyncハンドラ
の接続を同時に行い、最速のものを選択するようにロジックを変更するまでは、正常に動作しています。つまり、最初のasync_read_some
ハンドラが起動すると、他のソケット(シャットダウン、クローズ - すべて)をキャンセルし、現在のソケットを処理します。 95%のケースでは、他のソケットの読み取りハンドラがoperation_abortedエラーで呼び出されます。しかし時々、これらの読み取りハンドラはエラーなしで起動され、Nバイトを正常に受信したことを伝えます。
しかし、ソケットのドキュメントは::キャンセル()states:
この機能は、すべての未処理の非同期の送信、接続原因と はすぐに終了する操作を受信し、 キャンセル操作のためのハンドラが渡されます
boost::asio::error::operation_aborted
エラーです。
質問:プロダクトコードのエラーoperation_aborted
に本当に依存できますか?もしできれば、ブースト1.46.1からのAsioのバグですか?私ができない場合、これに関する正式な文書はありますか?
あなたのケースでは、キャンセルが呼び出される前に複数のハンドラが「成功」しているようです。 'operation_aborted'を利用して、まだ実行されていないハンドラに渡すことができます(呼び出されるのを待っています)。 – Chad