UDP を使用して同じデータグラムを多くのエンドポイントに送信する必要がありますが、ネットワークはマルチキャストをサポートしておらず、ユニキャストのみをサポートしています。テストするために、エンドポイント (サポートされているアドレス範囲内の偽の IP) のリストと、リストの最後でエコーを返す 1 つの有効なマシンを作成しました。目標は、エンド ツー エンドのレイテンシを測定することです。WireShark を使用すると、UDP メッセージは送信側で非常に高速にシリアル化されますが、メッセージの受信には時間がかかります。
Windows UDP ソケットは結合され、一定の時間または条件が発生した後に NIC 経由で送信されますか? 各データグラムをフラッシュするにはどうすればよいですか?
NoDelay と LingerOptions は UDP には適用されませんが、送信前に長引いているように見えます。
擬似コード:
- リストの生成 (5000 エンドポイント)
- リストの最後に Echo デバイスを追加します
Foreach (endpointList の変数 ep) {SendDataRetries(ep, ペイロード);}
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--; } } }