UDP - 我可以发送两个数据报部分,并使接收端将它们组合成一个吗?

Cip*_*ipi 5 c# sockets udp udpclient

这可能是一个愚蠢的问题,但由于我在这里相对较新,所以它...如果我有两个单独的字节数组,我需要接收端作为一个大数组,例如:

byte[] Array1 = {1,1,1}
byte[] Array2 = {2,2,2}
Run Code Online (Sandbox Code Playgroud)

我可以避免创建缓冲区并将每个数组复制到其中,然后发送该缓冲区,如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

因为如果两者都很大,而且数据速率很高,那么复制会占用很多系统资源......所以我可以告诉udpClient我正在启动UDP碎片,然后这样做:

udpClient.ImStartingOneBigDatagram();

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

udpClient.ThatsAllFolks();
Run Code Online (Sandbox Code Playgroud)

并确保接收方获得:

byte[] recv = {1,1,1,2,2,2}
Run Code Online (Sandbox Code Playgroud)

我正在使用C#,我不需要使用UdpClient,我只是在说明我的观点.

Ste*_*e-o 2

使用 Win32 API 的等效项WSASendMsg

public int Send(
    IList<ArraySegment<byte>> buffers,
    SocketFlags socketFlags,
    out SocketError errorCode
)
Run Code Online (Sandbox Code Playgroud)

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

但归根结底,这是不成熟的优化,如果您执行一些测试,您会发现要使用 I/O 分散收集数组,您至少需要 9KB 的数据才能获得性能改进。对于小缓冲区,即小于页面大小(x86 上为 4KB),在传递给套接字 API 之前自行构建连续缓冲区会更快。

  • 收集发送正是问题所在,完美答案。 (2认同)