我需要使用 UDP 将相同的数据报发送到许多端点,并且网络不支持多播,仅支持单播。为了测试,我创建了一个端点列表(支持的地址范围内的假 IP)和一台在列表末尾返回 echo 的有效机器。目标是测量端到端延迟。使用 WireShark,我看到 UDP 消息在发送方上的序列化速度非常快,但接收消息需要很长时间。
Windows UDP 套接字是否组合在一起并在一段时间或条件发生后通过 NIC 发送?如何刷新每个数据报?
我看到 NoDelay 和 LingerOptions 不适用于 UDP,但看起来它在发送之前一直存在。
伪代码:
- 生成列表(5000 个端点)
- 在列表末尾添加 Echo 设备
Foreach (var ep in endpointList) {SendDataRetries(ep, payload);}
public void SendDataRetries(string downlink, IPEndPoint ep, int retries) { if (string.IsNullOrEmpty(downlink)) return; Byte[] sendBytes = Encoding.ASCII.GetBytes(downlink + "\r\n"); for (int x = 0; x < retries; x++) { try { using (Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { server.DontFragment = true; server.SendTo(sendBytes, ep); server.Close(); //is this really needed to flush the write? } } catch (Exception ex) { Trace.WriteLine(string.Format("\n\nException\ndownlink:{0}\nep:{1}\nex:{2}", downlink, ep, ex)); x--; } } }