在本文中,我们展示了如何使用Ping类在C#中确定远程主机的可访问性。
Ping
位于System.Net.NetworkInformation
命名空间中。
Ping
类的名称和功能来自经典的ping网络实用程序。ping实用程序用于测试IP网络上远程主机的可达性。它在ICMP协议上运行。
主机和路由器使用Internet控制消息协议(ICMP)相互传递网络层信息。通常,它用于错误报告。该协议由RFC792描述。
Pinging正在向目标主机发送ICMP回显请求并等待ICMP回显回复。
Ping的
Send
和SendAsync
方法向远程计算机发送ICMP回应请求消息,并等待来自该计算机的ICMP回应消息。PingReply
提供有关消息产生的状态和数据的信息。
C#Ping发送
Send
方法将ICMP回显请求消息同步发送到远程计算机。
using System.Net.NetworkInformation; string url = "example.com"; using var ping = new Ping(); PingReply res = ping.Send(url); Console.WriteLine(res.Status);
程序以同步方式ping远程主机。
using System.Net.NetworkInformation;
Ping
位于System.Net.NetworkInformation
命名空间中。
using var ping = new Ping();
创建了一个Ping
对象。
PingReply res = ping.Send(url);
我们ping一个由URL指定的主机并收到一个PingReply
。
Console.WriteLine(res.Status);
我们打印回复的状态码。
$ dotnet run Success
C#PingReply.RoundtripTime
PingReply.RoundtripTime
返回发送ICMP回显请求和接收相应的ICMP回显回复消息所花费的毫秒数。
using System.Net.NetworkInformation; string url = "example.com"; using var ping = new Ping(); for (int i = 0; i < 3; i++) { PingReply res = await ping.SendPingAsync(url); Console.WriteLine($"{res.Status} from {res.Address} in {res.RoundtripTime} ms"); }
程序发送三个异步ping请求并返回状态、地址和往返时间。
Console.WriteLine($"{res.Status} from {res.Address} in {res.RoundtripTime} ms");
通过PingReply
的RoundtripTime
属性检索往返时间。
$ dotnet run Success from 2606:2800:220:1:248:1893:25c8:1946 in 199 ms Success from 2606:2800:220:1:248:1893:25c8:1946 in 129 ms Success from 2606:2800:220:1:248:1893:25c8:1946 in 145 ms
Ping超时
一些重载方法允许为ping指定超时选项。
$ sudo tc qdisc add dev lo root netem delay 800ms
我们使用Linux流量控制实用程序向本地主机添加800毫秒的延迟。
$ sudo tc qdisc del dev lo root
此命令删除lo接口的所有规则。
using System.Net.NetworkInformation; string url = "localhost"; using var ping = new Ping(); int timeout = 500; PingReply res = await ping.SendPingAsync(url, timeout); Console.WriteLine($"{res.Status} from {res.Address} in {res.RoundtripTime} ms");
在程序中,我们指定了500毫秒的超时。我们ping本地主机。
$ dotnet run TimedOut from 0.0.0.0 in 0 ms
在流量控制实用程序添加超时规则后,我们有一个超时状态。
$ dotnet run Success from 127.0.0.1 in 0 ms
移除延迟规则后,我们收到成功状态。
C#ping示例
在下一个示例中,我们创建了一个程序,它接受数据包数量和超时选项。
using System.Net.NetworkInformation; string? url = string.Empty; int c = 3; int w = 0; int n = args.Length; if (n == 1) { url = args[0]; } else if (n == 2) { url = args[0]; c = int.Parse(args[1]); } else if (n == 3) { url = args[0]; c = int.Parse(args[1]); w = int.Parse(args[2]); } else { Console.WriteLine("wrong number of parameters"); return; } using var ping = new Ping(); if (w > 0) { for (int i = 0; i < c; i++) { PingReply res = await ping.SendPingAsync(url, w); Console.WriteLine($"{res.Status} from {res.Address} in {res.RoundtripTime} ms"); } } else { for (int i = 0; i < c; i++) { PingReply res = await ping.SendPingAsync(url); Console.WriteLine($"{res.Status} from {res.Address} in {res.RoundtripTime} ms"); } }
第一个参数是强制性的,是url。接下来的两个可选参数是数据包的数量和超时。
$ dotnet run example.com 2 Success from 2606:2800:220:1:248:1893:25c8:1946 in 128 ms Success from 2606:2800:220:1:248:1893:25c8:1946 in 125 ms
在本文中,我们使用C#Ping类对远程主机执行ping操作。
列出所有C#教程。