0

ここでデザインの提案を探しています。socket.async_write を使用している場合、メッセージを送信しているクライアント コードは、メッセージが成功したか失敗したかを知るための同期結果を持たないため、送信を再試行する必要があるかどうか (または、どのようなエラー処理が呼び出されるか) もわかりません。メッセージの送信に失敗した場合。)

ブーストのドキュメントには次のように書かれています。

この関数は、特定のバイト数のデータをストリームに非同期で書き込むために使用されます。関数呼び出しは常にすぐに戻ります。非同期操作は、次の条件のいずれかが true になるまで続行されます。

  • 提供されたバッファー内のすべてのデータが書き込まれました。つまり、転送されるバイト数は、バッファ サイズの合計に等しくなります。
  • エラーが発生しました。

コールバック メソッドは、エラーが発生した場所と、実際に書き込まれたバイト数 (バッファー サイズよりも小さい場合はエラーを示します) の両方を通知します。

したがって、再送信を試みるか、メッセージが送信されなかったことを呼び出し元のコードに通知するために、送信されたことが通知されるまで、メッセージのコピーを保持する必要があるようです。

送信されたバッファ/メッセージへの参照を非同期ハンドラ メソッドに渡す方法はありますか? または、書き込まれているメッセージのコンテナを維持し、非同期書き込みが完了したときにポップアウトするより良いアプローチでしょうか?

4

1 に答える 1

2

boost::asio (またはc++11バージョン) ドキュメントの async-examples を見ると、チャット メッセージ clientなど、3 つの書き込みメソッドがあることがわかります。まず、使用されるコンテナがあります。

typedef std::deque<chat_message> chat_message_queue;
...
chat_message_queue write_msgs_;

データの送信が完了した後に呼び出しているメッセージchat_client::write(message)を非同期的に呼び出すメッセージを書く場合。両端キューからメッセージをポップしているのは handle_write メンバー関数のみであるため、エラーが発生した場合でもメッセージを利用できることがわかります。chat_client::do_writechat_client::handle_write

または、書き込まれているメッセージのコンテナを維持し、非同期書き込みが完了したときにポップアウトするより良いアプローチでしょうか?

メッセージが送信された場合はカウンターを使用してポップするか、エラーを出力するために使用することをお勧めします。


編集:

C++11 バージョンでchat_client::handle_writeはこれが欠落しておりdo_write、ラムダ関数を使用するメソッドで行われますが、それでも同じ動作をしています。

于 2013-07-05T17:21:38.790 に答える