2017-08-10 12 views
1

Boost ASIOを使用している私のudp gameserverのスループットを向上させたい。 今、私はパケットを送信する必要があるたびに、待ち行列に入れて、保留中のasync_send_to操作があるかどうかを確認します。そうであれば、何もしないで、async_send_toを呼び出します。 次に、書き込みハンドラが呼び出されるのを待ち、キュー内の次のパケットが存在する場合は、async_send_toを呼び出します。複数のBoost :: ASIO async_send_toを一度に実行

ドキュメンテーションによると、 "TCPソケット用"の方法ですが、UDPソケットについてはインターネット全体に何もありません。 これを試してみてください、それをstackoverflowで検索してください、あなたはこれについて誰も話していないでしょう、そしてあなたが見つける2つの質問のために、質問はユーザによって無視されたままになります。

なぜ秘密にされていますか? 1百万ドルの質問のために、書込みハンドラが呼び出されるのを待たずに安全にasync_send_toを複数行呼び出すことはできますか?

ありがとうございます。

答えて

1

このロジックは、送信操作をブロックする必要がないため、UDPプロトコルでは意味がありません。データグラムは配信されるか、または失われます。 UDPは、それを出力バッファに格納する必要はなく、ACKパケットを受信するまで無期限に再送する必要があります。

+0

ので、もちろん、ハンドラが呼び出されるまでバッファを有効にしたままで、書込みハンドラが呼び出されるのを待つことなく、すべてasync_send_toを連続して呼び出すことができますか? – NoobyLearner

1

いいえ、async_send_toを複数回連続して呼び出すことはできません。書き込みハンドラが呼び出されるのを待つことなく、安全に呼び出すことはできません。理由を正確に確認するにはAsynchronous IO with Boost.Asioを参照してください。

しかし、asioscatter gatherをサポートしていますので、あなたが複数のバッファ、例えばとasync_send_toを呼び出すことができます。

typedef std::deque<boost::asio::const_buffer> ConstBuffers; 

std::string msg_1("Blah"); 
... 
std::string msg_n("Blah"); 

ConstBuffers buffers; 
buffers.push_back(msg_1); 
... 
buffers.push_back(msg_n); 

socket_.async_send_to(buffers, tx_endpoint_, write_handler); 

ですから、double bufferingによってあなたのメッセージキューを、あなたのスループットを向上し、収集した書き込みを使用して可能性が...

+0

scatterはすべてのバッファを単一のデータグラムとして収集しますか? – sehe

+1

転送するデータの量、イーサネットフレームの大きさなどによって異なりますが、データグラムを可能な限り少なくするように努力します。 –

関連する問題