UDP の不安定性は物理層の特性であるという印象を受けましたが、そうではないようです。
一連のパケットに分割された UDP 経由でメッセージを送信しようとしています。メッセージの識別と並べ替えは暗黙的に行われます。
同じコンピューターで実行される 2 つのアプリでこの方法をテストし、スムーズに実行されることを期待しました。ただし、データ転送は完全に同じマシン上の 2 つのプログラム間で行われたにもかかわらず、パケットの損失が頻繁に発生していました。損失も非常にランダムなようです。メッセージ全体が通過する場合もあれば、通過しない場合もあります。
さて、同じマシンでも損失が発生するという事実は、私がそれを正しく行っているかどうか疑問に思います。
もともと、メッセージのすべてのピースをシングルショットで非同期に送信し、1 つのピースの完了を待たずに次のピースを送信していました。
次に、前のメッセージの完了ルーチン内から次のメッセージを送信しようとしました。これにより、パケット損失率は改善されましたが、完全に防止されたわけではありません。
ピースの間に一時停止 (Sleep(...)) を追加すると、100% 動作します。
編集: 答えが示唆したように:パケットは単に送信されるのが速すぎて、OS は最小限のバッファリングを行います。それは論理的です。
では、確認応答をシステムに追加して再送信するのを防ぎたい場合 (その場合は TCP を使用するだけで済みます)、どうすればよいでしょうか? データレートをより高いレベルに落とすことなく、パケット損失率を改善する最善の方法は何ですか?
編集2: 問題は、バッファが利用できないというよりも、正確にバッファオーバーフィルではない可能性があることに気づきました。私は非同期WSARecvFromを使用して受信しています。これは、私が理解しているように、デフォルトのOSバッファをオーバーライドするバッファを取ります。データグラムが受信されると、バッファに送られ、バッファがいっぱいかどうかにかかわらず、完了ルーチンが呼び出されます。
その時点で、完了ルーチン内から WSARecvFrom が再度呼び出されるまで、受信データを処理するためのバッファはまったくありません。
問題は、ある種のバッファープールを作成する方法があるかどうかです。そのため、別のバッファーが処理されている間にデータをバッファーに入れることができますか?