0

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--;
            }
    
        }
    }
    
4

0 に答える 0