2017-06-07 3 views
0

を送信しません:、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よりも表示された場合など

+0

どのように注文が「1」であることが分かりますか。 2. 3.ではなく、1ではない。 3.? 「3.データが送信されました」ではなく「3.データが受信されました」と測定したことを意味しましたか? – sehe

+0

1.ログメッセージにタイムスタンプを入れます。 async_writeの直前とそのハンドラの始めにログメッセージを出力します。私はそれらのタイムスタンプに基づいて1が2の前にあると判断します。 3については、Microsoft Message Analyzerを使用してネットワークトラフィックを取得しました。 Message Analyzerのキャプチャにはタイムスタンプも含まれています。私は、これらのタイムスタンプは、メッセージがasioコードからネットワークシステムに入る瞬間を表していると信じています。したがって、私はその注文が1であることを確信しています。2. 3。 2.私は "3.データが送信されました"と書いたとき、私はデータが送られたことを意味しました。 – IakovK

+0

MMAで2よりも後のタイムスタンプが表示された場合は、2の後に送信されたことを意味しません(プロトコルのどこにタイムスタンプが表示されているかによって異なります)。それはちょうどMMAがそれを後で見たことを意味するかもしれないまた、ナグルのアルゴリズムのようなものも有効です。 – sehe

答えて

0

をログファイルを提供することができ、簡単にケースを再現することができますプロトコルにはタイムスタンプが表示されます)。それはちょうどMMAがそれを後で見たことを意味するかもしれないまた、ナグルのアルゴリズムのようなものも有効です。

TCP NODELAYを設定してみてください。

socket.open(tcp::v4()); 
socket.set_option(tcp::no_delay(true)); 
socket.async_connect(endpoint, handler); 
+0

私は、MMAがWindowsネットワーキングサブシステムに入ったとき、つまりsocket.send関数が呼び出されたときにメッセージを見ると信じています。どうして私がそうでなければ信じるべきか説明してください。 – IakovK

+0

MMAはカーネル内で実行されず、すべてのプロセスがかなりスケジュールされているためです。コアが予測できない、または固定されていない次回のスライスを取得します。 – sehe

+0

私の設定では無視できます。スケジューリングが適切であれば、すべてのプロセスがミリ秒以内に実行される可能性があります。私の場合、遅延は50秒程度です。ミリ秒はごくわずかです。 – IakovK

関連する問題