【发布时间】:2011-09-26 04:32:39
【问题描述】:
这可能是一个愚蠢的问题,但由于我对 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,你甚至无法确定接收端是否会接收它们,更不用说它们是否会按顺序接收。数据报要么全部接收,要么根本不接收。接收端不会在一个 Receive 中合并多个数据报。
-
@Mark H:UDP 分片呢? UDP数据包中有MF(更多片段)标志,如果我可以在第一个数据包上将其设置为1,在最后一个数据包上设置为0,那将与IP执行的UDP pakcet分片相同......不是吗?
-
Cipi,MF标志在IP包里,不是UDP!
-
哦,是的,IP,抱歉……我的意思是……我可以从 C# 中设置那个标志吗??
-
我没有看到任何“在这种情况下有错误”。您有一个发送和一个接收。