Windows ping是否与C#PingReply不同

时间:2014-03-07 12:03:48

标签: c# ping

我有一个应用程序通知用户他的互联网连接有不可接受的延迟(这是一个voip应用程序)。我使用以下代码来检查延迟:

IPAddress address = GetIpFromHost(this._testAddress);
if (address != null)
{
this.SlowConnection = new SlowConnectionProblem(4, 100);

//set the ping options, TTL 128
PingOptions pingOptions = new PingOptions(128, true);

//create a new ping instance
Ping ping = new Ping();

//32 byte buffer (create empty)
byte[] buffer = new byte[32];

while (!_slowConnectionChecker.CancellationPending)
{
    System.Threading.Thread.Sleep(this._checkInterval);
    try
    {
        //send the ping 4 times to the host and record the returned data.
        //The Send() method expects 4 items:
        //1) The IPAddress we are pinging
        //2) The timeout value
        //3) A buffer (our byte array)
        //4) PingOptions
        PingReply pingReply = ping.Send(address, 1000, buffer, pingOptions);

        //make sure we dont have a null reply
        if (!(pingReply == null))
        {
            if (pingReply.Status == IPStatus.Success)
            {
                int time = Convert.ToInt32(pingReply.RoundtripTime);
                this.SlowConnection.addNewPingTime(time);
                if (this.SlowConnection.HasProblem)
                {
                    addConnectionProblem(this.SlowConnection);
                }
                else
                {
                    removeConnectionProblem(this.SlowConnection);
                }
            }
        }
    }
    catch (PingException ex)
    {
    }
    catch (SocketException ex)
    {
    }
}
}

通常,包含上述方法的类计算平均ping。大多数时候它工作正常,但很少有我在我的应用程序中有一个奇怪的情况我有一个警告显示高ping到google.pl - 大约128毫秒,同时Windows ping显示我大约24毫秒。

我仔细检查了代码,似乎没有错误。

1 个答案:

答案 0 :(得分:2)

简而言之,是的,它们是相同的机制。

MSDN

PingReply

  

Ping类尝试发送Internet控制消息协议   ( ICMP )向远程计算机发送回应请求并重新接收信息   从计算机通过ICMP回复回复消息。 Ping类使用   PingReply类的实例返回有关的信息   操作,例如其状态和发送请求所花费的时间   并收到答复。

     

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.pingreply%28v=vs.110%29.aspx

Windows中的

ping命令

  

通过发送验证与其他TCP / IP计算机的 IP级别连接   Internet控制消息协议( ICMP )回显请求消息。该   收到相应的Echo Reply消息,同时显示   往返时间。 Ping是用于的主要TCP / IP命令   解决连接,可达性和名称解析问题。用过的   没有参数,ping显示帮助。

     

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ping.mspx?mfr=true

注意,IP级别连接。您使用的是TCP还是UDP?这些可能会导致您的行为不同。


  

同时

两次ICMP ping不太可能同时发生。结果通常会有所不同,因为每次尝试都不保证IP路由是相同的。你有没有考虑ping你的呼叫服务器而不是谷歌?这将使您更好地表现您的传输质量。您可能想要测量带宽,而不是ping。这里和那里几百毫秒不会像电视游戏那样扰乱电话。您希望获得具有代表性的数据包大小的飞行时间,而不是微小的ICMP数据包。

根据您的传输协议,ICMP ping可能无法为您提供最佳的通话质量。您应该考虑一个自定义的ping实现,尽可能地模拟您的应用程序。