【问题标题】:Compute Network Latency on Multiple Connected Adapters在多个连接的适配器上计算网络延迟
【发布时间】:2025-12-29 13:40:07
【问题描述】:

我需要计算具有多个连接适配器的系统上的网络延迟。 我正在使用 System.Net.NetworkInformation.Ping 类来 ping 地址并使用 RoundtripTime 属性来确定延迟。

这很好用。但是在具有多个连接适配器的系统上,我需要 提供要使用的源 IP,以确定每个可用连接的延迟。

但是,此类不提供使用特定源 IP 地址 ping 的选项

我需要类似于 ping DOS 命令的东西。此命令有 -S 选项,可让您提供源 IP 地址。

有没有办法在 System.Net.NetworkInformation.Ping 中指定源 IP 地址。 PingOptions 类不提供任何此类选项。

谢谢。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    我发现此链接 (http://www.dreamincode.net/forums/topic/71263-using-the-ping-class-in-c%23/) 有助于查看 Ping 类,但我还没有找到设置 Ping 源的方法。

    使用基于 ICMP 的 ping 时要记住的一件事是,网络设备通常会为 ICMP 流量提供比普通数据包更低的优先级,尤其是当数据包跨越网络边界(例如 WAN 链接)时。这可能会导致 ping 被丢弃或显示比流量实际经历的延迟更高,并使其成为问题的指标而不是测量https://*.com/a/1671489/901395

    最大的问题可能是,您的应用程序是否将在具有 QoS 的网络上运行?如果是,您真正希望测量哪种类型的流量?

    IPGlobalStatistics 类可能会有所帮助:http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalstatistics(v=vs.90).aspx

    这个答案也可能会有所帮助:https://*.com/a/2506432/901395 使用下面的代码循环接口

    class MainClass 
    { 
    static void Main() 
    { 
        if (!NetworkInterface.GetIsNetworkAvailable()) 
           return; 
    
        NetworkInterface[] interfaces  
            = NetworkInterface.GetAllNetworkInterfaces(); 
    
        foreach (NetworkInterface ni in interfaces) 
        {                 
            Console.WriteLine("    Bytes Sent: {0}",  
                ni.GetIPv4Statistics().BytesSent); 
            Console.WriteLine("    Bytes Received: {0}", 
                ni.GetIPv4Statistics().BytesReceived); 
        } 
    } 
    } 
    

    【讨论】:

    • 谢谢。我不打算测量任何特定的流量。我正在开发一个简单的 Windows 应用程序来监控可用网络连接的质量。我要监控的属性是上传速度、下载速度和延迟。
    • 我已经用另一个想法更新了答案,它不能解决延迟问题,但它有助于一般统计数据
    【解决方案2】:
    //Provide any URL to ping.
    Uri objURL = new Uri("ANY URL");
    System.Net.NetworkInformation.Ping objPing = new System.Net.NetworkInformation.Ping();
    System.Net.NetworkInformation.PingOptions objPingOptn = new System.Net.NetworkInformation.PingOptions();
    
    //Decides if packet to be sent in a go or divide in small chunks
    objPingOptn.DontFragment = true;
    //Creating a buffer of 32 bytes.
    string tPacketData = "DummyPacketsDataDummyPacketsData";
    byte[] bBuffer = Encoding.ASCII.GetBytes(tPacketData);
    //Can provide host name directly if available
    System.Net.NetworkInformation.PingReply objPingRply = objPing.Send(objURL.Host, 120, bBuffer, objPingOptn);
    
    objPing.Dispose();
    if (objPingRply.Status == System.Net.NetworkInformation.IPStatus.Success)
        return true;
    else
        return false;
    

    【讨论】:

    • 虽然没有回答问题