ここでデザインの提案を探しています。socket.async_write を使用している場合、メッセージを送信しているクライアント コードは、メッセージが成功したか失敗したかを知るための同期結果を持たないため、送信を再試行する必要があるかどうか (または、どのようなエラー処理が呼び出されるか) もわかりません。メッセージの送信に失敗した場合。)
ブーストのドキュメントには次のように書かれています。
この関数は、特定のバイト数のデータをストリームに非同期で書き込むために使用されます。関数呼び出しは常にすぐに戻ります。非同期操作は、次の条件のいずれかが true になるまで続行されます。
- 提供されたバッファー内のすべてのデータが書き込まれました。つまり、転送されるバイト数は、バッファ サイズの合計に等しくなります。
- エラーが発生しました。
コールバック メソッドは、エラーが発生した場所と、実際に書き込まれたバイト数 (バッファー サイズよりも小さい場合はエラーを示します) の両方を通知します。
したがって、再送信を試みるか、メッセージが送信されなかったことを呼び出し元のコードに通知するために、送信されたことが通知されるまで、メッセージのコピーを保持する必要があるようです。
送信されたバッファ/メッセージへの参照を非同期ハンドラ メソッドに渡す方法はありますか? または、書き込まれているメッセージのコンテナを維持し、非同期書き込みが完了したときにポップアウトするより良いアプローチでしょうか?