5

boost::asio udp ソケットを使用して UDP サーバーとクライアントを作成しました。データグラムの送信を開始する前は、すべて問題ないように見えました。それらはクライアントからサーバーに正しく送信されます。しかし、それらは私のバッファ内で 1 つのメッセージに統合されています。

私が使う

udp::socket::async_receivestd::array<char, 1 << 18 >バッファ付

非同期リクエストを行うため。コールバックを介してデータを受信する

void on_receive(const error_code& code, size_t bytes_transferred)

データを頻繁に(10 ミリ秒ごとに) 送信すると、上記のコールバックを使用して複数のデータグラムを同時にバッファーに受信します。問題は、それらをどのように分離するかです。注: 私の UDP データグラムは可変長です。サイズの追加ヘッダーを使用したくありません。サードパーティのデータグラムに対してコードが役に立たなくなるためです。

4

1 に答える 1

0

これは、boost::asio がステートレス データ ストリームを処理する方法の制限だと思います。シリアル インターフェイスに boost::asio を使用すると、まったく同じ動作に気付きました。パケット間に比較的大きなギャップがあるパケットを送信していたとき、個別のコールバックでそれぞれを受信して​​いました。パケット サイズが大きくなり、パケット間のギャップが減少するにつれて、1 つのパケットを受信した後ではなく、バッファがいっぱいになったときにのみコールバックを実行する段階に達しました。

予想されるデータグラムのサイズが正確にわかっている場合、入力バッファーのサイズを制限するソリューションは、アプリオリに必要なバッファーの大きさを正確に知っているため、完全に賢明なものです。

輻輳の原因が複数の異なるパケット タイプの送信であるため、正しいサイズのバッファーを事前に割り当てることができない場合は、トランザクションのタイプごとに異なるポートに異なるソケットを作成する可能性があります。それはもう少し「ハック」ですが、おそらく同様に役立つ20,000の異なるパケットタイプを使用していない限り、エフェメラルポートの可用性の事実上無制限の性質を考えると.

于 2013-08-21T01:18:58.400 に答える