计算多个连接适配器的网络延迟

时间:2012-02-29 18:21:39

标签: c# .net

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

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

最大的问题可能是,您的应用程序是否会在具有QoS的网络上运行,如果是这样,您真正关注的是什么类型的流量?

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

这个答案也许有帮助:https://stackoverflow.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); 
    } 
} 
} 

答案 1 :(得分:0)

//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;