开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 平

在本文中,我们展示了如何使用Ping类在C#中确定远程主机的可访问性。

Ping位于System.Net.NetworkInformation命名空间中。

Ping类的名称和功能来自经典的ping网络实用程序。ping实用程序用于测试IP网络上远程主机的可达性。它在ICMP协议上运行。

主机和路由器使用Internet控制消息协议(ICMP)相互传递网络层信息。通常,它用于错误报告。该协议由RFC792描述。

Pinging正在向目标主机发送ICMP回显请求并等待ICMP回显回复。

Ping的SendSendAsync方法向远程计算机发送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");

通过PingReplyRoundtripTime属性检索往返时间。

$ 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#教程。

未经允许不得转载:我爱分享网 » C# 平

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏