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

本文关键字:接收端 合并 一个 我可以 两个 UDP- 数据报部 | 更新日期: 2023-09-27 18:00:42

这可能是一个愚蠢的问题,但由于我对UDP还比较陌生,所以。。。如果我有两个独立的字节数组,我需要接收端将其作为一个大数组,例如:

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);

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

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

并且要确保接收方会得到:

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

我使用C#来实现这一点,我不需要使用UdpClient,我只是在表达我的观点。

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

使用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之前自己构建连续缓冲区会更快。

是的,您可以将任何数据块拆分为两部分,并将其作为两个独立的UDP数据包发送出去。然而,UDP不能保证交付,因此其中一个部件可能在运输过程中丢失。如果收件人只收到一半的邮件,你会怎么办?很明显,把它扔掉,但UDP需要记住一些东西。

所以,要回答你问题的最后一部分"并确保接收方会得到……",答案是否定的。你使用的是UDP,所以你不能确定接收方会得到什么。

如果你想为了方便而不是为了网络数据包大小的问题将发送分解为多个块,你当然可以编写自己的包装类,它位于UDPclient之上,通过send方法调用接受多个数据块,并且只将所有数据发送到UDPclient。调用时发送()。这是包装类上的所有人。但这不会减少内存开销,因为包装器必须在大发送之前在内存中积累数据。这个包装器只是为您的客户端代码提供了一个外观上的便利。