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,我只是在说明我的观点.
使用 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 之前自行构建连续缓冲区会更快。