async_connect() をタイムアウト付きで実装しようとしています。
async_connect_with_timeout(socket_type & s,
std::function<void(BoostAndCustomError const & error)> const & connect_handler,
time_type timeout);
操作が完了すると、操作結果 (タイムアウトを含む) を示しconnect_handler(error)
て呼び出されます。error
タイムアウトの例 1.51のコードを使用したいと思っていました。最大の違いは、io_service.run() を実行する複数のワーカー スレッドを使用していることです。
サンプル コードが機能し続けるには、どのような変更が必要ですか?
私の問題は次のとおりです。
呼び出す場合:
Start() { socket_.async_connect(Handleconnect); dealine_.async_wait(HandleTimeout); }
HandleConnect()
以前でも別のスレッドで完了することができますasync_wait()
(可能性は低いですが可能です)。、、およびをstrand
ラップする必要がありますか?Start()
HandleConnect()
HandleTimeout()
HandleConnect()
エラーなしで最初に呼び出されたが、「近い将来の呼び出しのためにキューに入れられた」ために失敗した場合はどうなりますdeadline_timer.cancel()
か? サンプルコードでソケットを閉じることができるようです。このような動作 (接続後にいくつかの操作を開始した後、タイマーが接続を閉じる) は、深刻な頭痛の種になりやすいです。deadline_timer.expires_from_now()
HandleTimeout()
HandleTimeout()
HandleTimeout()
とが最初に呼び出されたらどうでしょうかsocket.close()
。HandlerConnect()
エラーなしで既に「キューに入れられている」可能性はありますか? ドキュメントには、「非同期の送信、受信、または接続操作はすぐにキャンセルされ、boost::asio::error::operation_aborted
エラーが発生して完了します」と記載されています。マルチスレッド環境で「すぐに」とはどういう意味ですか?