5

これはばかげた質問かもしれませんが、ここではUDPに比較的慣れていないので、次のようになります... 2つの別々のバイト配列があり、受信側が1つの大きな配列として取得する必要がある場合。

byte[] Array1 = {1,1,1}
byte[] Array2 = {2,2,2}

次のように、バッファを作成して各配列をコピーしてから、そのバッファを送信する必要をなくすことができますか?

byte[] Buffer= new byte[Array1.Length + Array2.Length];
Buffer.BlockCopy(Array1, 0, Buffer, 0, Array1.Length);
Buffer.BlockCopy(Array2, 0, Buffer, Array1.Length, Array2.Length);

udpClient.Send(Buffer, Buffer.Length);

2つが大きく、データレートが高い場合、コピーは多くのシステムリソースを消費するため、UDPフラグメンテーションを開始していることをudpClientに伝えて、次のようにすることができます。

udpClient.ImStartingOneBigDatagram();

udpClient.Send(Array1, Array1.Length);
udpClient.Send(Array2, Array2.Length);

udpClient.ThatsAllFolks();

そして、受信側が次のようになることを確認してください。

byte[] recv = {1,1,1,2,2,2}

私はこれにC#を使用していますが、使用する必要はありUdpClientません。

4

2 に答える 2

2

Win32 API と同等のものを使用しますWSASendMsg

public int Send(
    IList<ArraySegment<byte>> buffers,
    SocketFlags socketFlags,
    out SocketError errorCode
)

http://msdn.microsoft.com/en-us/library/ms145161.aspx

しかし、最終的にはこれは時期尚早の最適化です。いくつかのテストを実行すると、I/O スキャッター ギャザー アレイを使用してパフォーマンスを向上させるには、少なくとも 9KB のデータが必要であることがわかります。小さなバッファー、つまりページ サイズ(x86 では 4KB)未満の場合は、ソケット API に渡す前に連続したバッファーを自分で構築する方が高速です。

于 2011-07-01T14:42:03.860 に答える
2

はい、任意のデータ ブロックを 2 つの部分に分割し、2 つの個別の UDP パケットとして送信できます。ただし、UDP は配送を保証するものではないため、配送中にピースの 1 つが欠落する可能性があります。受信者がメッセージの半分しか受信しない場合はどうしますか? 明らかに、それを捨てますが、UDP で心に留めておくべきことがあります。

したがって、あなたの質問の最後の部分「そして、受信側が確実に取得できるようにすること」に答えるには、答えはノーです。UDPを使用しているため、受信側が何かを取得できるかどうかはわかりません。

ネットワーク パケット サイズの問題ではなく、利便性のために送信を複数のチャンクに分割したい場合は、UDPclient の上に位置し、Send メソッド呼び出しを介してデータの複数のチャンクを受け入れ、送信のみを行う独自のラッパー クラスを作成できます。ラッパー クラスで .ThatsAllFolks を呼び出すと、すべてのデータが udpclient.Send() に送信されます。しかし、ラッパーはビッグ センドの前にデータをメモリに蓄積する必要があるため、メモリ オーバーヘッドは削減されません。このラッパーは、クライアント コードの表面的な利便性にすぎません。

于 2011-06-30T17:40:09.113 に答える