在本文中,我们展示了如何使用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#教程。
