他のStack Overflowエントリとboost::asio
のドキュメントを読んでから、呼び出しのパラメータとして使いやすいタイムアウトを提供する同期ASIO読み書き呼び出しがないことを確認しました。C++ Boost ASIO:タイムアウトで読み書きする方法は?
私は、タイムアウトを使用するselect(2)コールで旧式のLinuxソケットアプリケーションを変換する途中にありますが、それ以上のことをやる必要があります。
boost::asio
でこれを行うにはどうすればよいですか? asioドキュメントを見ると、タイマーとはさまざまなものが混乱する例がたくさんありますが、私はかなり混乱しています。 ソケットから読み取っても、関数が何も返さないか、またはできるだけ早く返すことができる最大秒数Xを待ってください。タイムアウトが切れる前にソケットから読み取る。
この例について混乱していることを具体的に説明してください。http://think-async.com/Asio/asio-1.4.7/src/examples/timeouts/blocking_tcp_clientcpp - 不可欠なロジックは、2つの非同期タスクをディスパッチすることです.1つは読み取り/書き込み、もう1つは読み取り/書き込みが最初に戻る場合はタイムアウトタイマーが終了した場合はロジックが読み書きそれでもあなたのタイムアウトロジックを進めてください。非常に非常に簡単です。 –
コールバックのキューイングに関連するhfネットワークで発生するコーナーケースが1つあります。タイムアウトcbがキューに入れられた後、読み書きはキューに入れられます。実際には読み取り/書き込みが完了したときにタイムアウト・ロジックを実行し始めます。私が見た可能な解決策は、ダブル・チェック・ロックに似たものです。つまり、最初のタイムアウトが戻ったときに、しかし、これは2番目のタイムアウトがキューに入った後に読み書きがキューに入れられた場合と同じ問題を抱えています。 –
タイムアウトは厳しい条件であることを覚えておいてください。私は何か具体的なことをするでしょう - これは、読み書きがすでに行われているかもしれないという事実を含み、あなたがまだそれを受け取っていないという事実を変えないということです。 –