UDP を使用して同じプログラムの他のインスタンスと通信するネットワーク ソフトウェアがあります。さまざまな理由から、ここでは UDP を使用する必要があります。
最近、UDP 経由で大量のデータを送信する際に問題が発生し、メッセージを小さなデータ チャンクに分割するための断片化システムを実装する必要がありました。これまでのところうまくいきましたが、大量のデータ チャンクを送信する必要があるときに問題が発生しました。
私は次のアルゴリズムを持っています:
- メッセージを小さなデータ チャンク (約 1500 バイト) に分割します。
- データ チャンク リストを反復処理し、それぞれについて、次を使用して送信します。
sendto()
しかし、大量のデータ チャンクを送信すると、受信者は最初の 6 つのメッセージしか取得しません。6 番目を逃して 7 番目を受け取ることもあります。場合によります。
とにかく、sendto()
常に成功を示します。これは、ループバック インターフェイス (127.0.0.1) 経由でソフトウェアをテストすると常に発生しますが、LAN ネットワーク経由では発生しません。
std::cout << "test" << std::endl;
間に何かを追加するとsendto()
、すべてのフレームが受信されます。
UDP ではパケット損失が許容されることと、多くの理由でフレームが損失する可能性があることを認識しています。これは、データ チャンクを送信する速度に関係していると思います。
ここで正しいアプローチは何でしょうか?
- 何らかの確認応答メカニズム (TCP など) を実装するのはやり過ぎのようです。
- 間に任意の待機時間を追加するの
sendto()
は見苦しく、おそらくパフォーマンスが低下します。 - (可能であれば) 受信機の UDP 内部バッファーを増やしますか? これが可能かどうかさえわかりません。
- 他の何か?
ここであなたのアドバイスが本当に必要です。
ありがとうございました。
要求に応じた追加情報
UDP を使用しなければならない理由は、いくつかの制約があるためです。
- TCP は NAT トラバーサルでうまく機能しません(少なくとも特定の構成がなければ)
- 一部のメッセージが失われる可能性があります。できない人もいます。
- メッセージの配信順序は重要ではありません。