1

読み取り操作ハンドラーがエラーを返した場合、接続が切断/失敗/ダウンしていることを意味しますか? 別の非同期操作を開始する意味はありますか?

つまり、考えられるさまざまなエラーに応じて、因果関係は非常に複雑になる可能性があります。

void ReadHandler(const boost::system::error_code& error, size_t bytes_transferred)
{
   if(!error)
   {
      // OK
   }
   else
   {
      // does it make any sense to continue and start another async operation ?
      // or I have to check the error with error.value() and possibly close
      // the session or stop reading...etc ?
   }

接続がまだ使用可能かどうかを確認するにはどうすればよいですか? 下のTCPレイヤーで読み取りエラーが発生するのは、接続に何か問題があったためですか?

4

2 に答える 2

0

ハンドラーがゼロ以外のエラーで呼び出されたときに何をするかは、実際にはアプリケーション、さらには非同期操作に依存します。ほとんどのアプリケーションboost::asio::error::operation_abortedでは、プログラムがシャットダウンしていることを意味するため、通常、他のエラーとは異なる方法で処理します。プロトコルによっては、boost::asio::error::eof別の解釈も必要になる場合があります。ソケットが予告なしに閉じられるのは完全に適切な場合があります。

于 2013-04-13T15:59:58.650 に答える
0

エラー自体が何であるかを理解することには、おそらく何らかの価値があります。しかしその一方で、「どのエラーが続行しても問題がなく、どのエラーが問題なのか」の包括的なリストがない限り、とにかく「最善の推測」アプローチで終わることになります。

ほとんどの場合、いくつかのエラーは回復可能です - 一時的にパケットを受信するのに十分なバッファ スペースがない、またはそのようなものです。その他のエラーは永続的です (誰かがネットワーク スイッチの電源を抜いた...)。

この問題を解決する 1 つの方法は、連続して発生するエラーの数をカウントすることです。続行して別のエラーが発生しない場合は問題ありません... 3 つ (または 5 つ、10、または 100) エラーが発生した場合状況はおそらく改善されていないため、続けて終了します

もう 1 つの方法は、一定時間ごとに非常に多くのエラーを許容することです (たとえば、10 秒間に 5 個以上のエラー、1 分間に 50 個以上のエラー、またはアプリケーションにとって意味のあるものは何でも)。

3 番目のアプローチは、ユーザーに尋ねることです。これは、ユーザーのレベルに大きく依存します。「エラー X が発生しました。続行しますか? (はい)|(いいえ)」タイプの質問のようなメッセージが与えられた場合、ユーザーは何をしますか? .

もちろん、質問の大部分は、「あなたのアプリケーションは何をしているのか、エラー処理に関して「間違っている」とどうなるのですか?」というものです。- あなたのプロジェクトをもっと理解しないと、私たちは本当にそれに答えることができません - そして実際には、それはおそらくこのウェブサイトのガイドラインを少し超えて解決することです.

于 2013-04-12T14:45:42.157 に答える