私のコードでは、boost::asio と io_service を 1 つのスレッドで使用して、さまざまなソケット操作を実行しています。boost::system::error_code
すべての操作は非同期であり、すべてのハンドラーは(特に) に依存してboost::asio::error::operation_aborted
操作の結果を決定します。
ロジックを変更して複数の同時接続を作成し、最速の接続を選択するまでは、完全にうまく機能しています。つまり、最初のasync_read_some
ハンドラーが起動すると、他のソケット (シャットダウン、クローズなどすべて) をキャンセルし、現在のソケットに進みます。95% のケースで、他のソケットの読み取りハンドラーが operation_aborted エラーで呼び出されます。ただし、これらの読み取りハンドラーがエラーなしで呼び出され、N バイトを正常に受信したことが示されることがあります。
しかし、socket::cancel() のドキュメントには次のように記載されています。
この関数により、すべての未解決の非同期接続、送信、および受信操作がただちに終了し、キャンセルされた操作のハンドラーに
boost::asio::error::operation_aborted
エラーが渡されます。
operation_aborted
では、質問:本番コードのエラーを本当に信頼できるでしょうか? 可能であれば、Boost 1.46.1 からの Asio のバグですか? できない場合、これに関する公式文書はありますか?