• 在 .NET Core 2.0 中使用 ICMP做Ping操作
  • 发布于 1个月前
  • 69 热度
    1 评论
在经典的 .NET Framework 应用里,我们曾经使用 System.Net.NetworkInformation.Ping 去Ping一个远程主机。不过这个API在.NET Core中并没有默认包含,甚至最新的2.0版里也没有包含。其实在.NET Core里其实也是有非常方便的方法去做Ping操作的。

首先,我们需要加入一个NuGet包: System.Net.Ping
Install-Package System.Net.Ping

这个包含有和.NET Framework中一样的Ping API:

于是,在你的.NET Core代码中,你可以像在 .NET Framework 应用里一摸一样的使用Ping操作,在下面的例子里,我使用的是一个.NET Core 2.0的命令行程序:
static void Main(string[] args)
{    
    string targetHost = "bing.com";    
    string data = "a quick brown fox jumped over the lazy dog";

    Ping pingSender = new Ping();
    PingOptions options = new PingOptions
    {
        DontFragment = true
    };    
    byte[] buffer = Encoding.ASCII.GetBytes(data);    
    int timeout = 1024;

    Console.WriteLine($"Pinging {targetHost}");
    PingReply reply = pingSender.Send(targetHost, timeout, buffer, options);    
    if (reply.Status == IPStatus.Success)
    {
        Console.WriteLine($"Address: {reply.Address}");
        Console.WriteLine($"RoundTrip time: {reply.RoundtripTime}");
        Console.WriteLine($"Time to live: {reply.Options.Ttl}");
        Console.WriteLine($"Don't fragment: {reply.Options.DontFragment}");
        Console.WriteLine($"Buffer size: {reply.Buffer.Length}");
    }    
    else
    {
        Console.WriteLine(reply.Status);
    }
}

但请留意,你可能从MSDN上看到这个例子的.NET Framework版本,中间的timeout值是120,这很容易导致Ping失败。我把这个值改成了1024, 之后这个例子就可以成功运行了。这并不是.NET Framework和.NET Core的差异,因为在.NET Framework中,120的默认值也会导致失败。

另一件事就是UWP 6.0.1虽然是使用.NET Core 2.0的,但是Ping目前不受支持。如果你尝试在一个UWP应用里使用Ping,会爆到天上去:

用户评论