を送信しません:、async_writeはデータが与えられ
asio::ssl::stream<asio::ip::tcp::socket&> &m_socket;
async_write(self->m_socket, asio::buffer(self->m_v),
[self, handler](asio::error_code ec, std::size_t s)
{
handler(ec);
});
結果:データが送信される前にハンドラが呼び出され (socket.send()関数が呼び出されます)。 結果2: データは実際に長い時間の後に送信されます。再現可能なケースでは約1分です。 したがって、一連のイベントは次のとおりです。 1. async_write
が呼び出されます。 2.ハンドラが呼び出されました。 3.データが送信されます。
私は、正しいシーケンスは以下の通りであると信じています。 1. async_write
が呼び出されました。 2.データが送信されます。 3.ハンドラが呼び出されました。
いつも起こるわけではありませんが、非常に再現性があります。私はインターネット上で同様のケースを検索しました。何も見つかりませんでした。
私はアドバイスが必要です:それについて何をするか。それはasioのバグですか、それとも私のプログラムの中にはややこしいバグでしょうか?
私はどこにあるに応じて、(それは2の後に送られてしまったというわけではありませんので、あなたはタイムスタンプ後のMMA中2よりも表示された場合など
どのように注文が「1」であることが分かりますか。 2. 3.ではなく、1ではない。 3.? 「3.データが送信されました」ではなく「3.データが受信されました」と測定したことを意味しましたか? – sehe
1.ログメッセージにタイムスタンプを入れます。 async_writeの直前とそのハンドラの始めにログメッセージを出力します。私はそれらのタイムスタンプに基づいて1が2の前にあると判断します。 3については、Microsoft Message Analyzerを使用してネットワークトラフィックを取得しました。 Message Analyzerのキャプチャにはタイムスタンプも含まれています。私は、これらのタイムスタンプは、メッセージがasioコードからネットワークシステムに入る瞬間を表していると信じています。したがって、私はその注文が1であることを確信しています。2. 3。 2.私は "3.データが送信されました"と書いたとき、私はデータが送られたことを意味しました。 – IakovK
MMAで2よりも後のタイムスタンプが表示された場合は、2の後に送信されたことを意味しません(プロトコルのどこにタイムスタンプが表示されているかによって異なります)。それはちょうどMMAがそれを後で見たことを意味するかもしれないまた、ナグルのアルゴリズムのようなものも有効です。 – sehe