C# 實現Ping遠端主機功能

WeskyNet發表於2024-05-11

C#實現Ping遠端主機功能。

1、引用nuget包 Wesky.Net.OpenTools

OpenTools是一個用於提高開發效率的開源工具庫。該專案為個人開源專案,採用MIT開源協議,永不更改協議。開源專案地址:

Gitee:https://gitee.com/dreamer_j/open-tools.git
Github:https://github.com/LittleLittleRobot/OpenTools.git
個人公眾號:Dotnet Dancer
工具更新說明:
1.0.1 提供AES加密解密功能
1.0.2 提供本地Ping遠端主機功能,包括支援IP地址、域名

本教程將演示1.0.2版本更新功能,以及實現的具體程式碼演示。

咱們先看一下正常的Ping的效果:

引用nuget包以後,只需要直接呼叫:

PingHelper.PingHost方法即可,第一個引數是IP地址或域名,第二個是超時時間,單位毫秒.

具體原始碼和實現說明:

 1  /// <summary>
 2  /// 對指定主機執行 ping 操作並返回結果
 3  /// Ping the specified host and return the result
 4  /// </summary>
 5  /// <param name="host">需要被 ping 的主機或 IP 地址 The hostname or IP address to ping</param>
 6  /// <param name="timeout">ping 超時時間,以毫秒為單位 Timeout duration in milliseconds for ping</param>
 7  /// <returns>包含 ping 操作結果的 PingResultInfo 物件 A PingResultInfo object containing the result of the ping operation</returns>
 8  public static PingResultInfo PingHost(string host, int timeout)
 9  {
10      try
11      {
12          // 解析域名獲取 IP 地址
13          // Resolve the domain name to get IP address
14          IPAddress[] addresses = Dns.GetHostAddresses(host);
15          if (addresses.Length == 0)
16          {
17              return new PingResultInfo
18              {
19                  Host = null,
20                  Result = false,
21                  Message = "No IP addresses resolved"
22              };
23          }
24          using (Ping pingSender = new Ping())
25          {
26              PingOptions options = new PingOptions
27              {
28                  // 設定防止資料包被分片
29                  DontFragment = true // Prevent packet fragmentation
30              };
31 
32              // 資料緩衝區,包含要傳送的字串資料
33              // Data buffer containing the string data to send
34              string data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345";
35              byte[] buffer = Encoding.ASCII.GetBytes(data);
36 
37              // 使用第一個解析的 IP 地址進行 ping 操作
38              // Use the first resolved IP address to perform the ping
39              IPAddress targetIP = addresses[0];
40 
41              // 傳送 ping 請求並獲取回覆
42              // Send the ping request and obtain the reply
43              PingReply reply = pingSender.Send(targetIP, timeout, buffer, options);
44 
45              // 建立並返回包含 ping 操作結果的 PingResultInfo 物件
46              // Create and return a PingResultInfo object containing the ping result
47              return new PingResultInfo
48              {
49                  Host = targetIP,
50                  Result = reply.Status == IPStatus.Success,
51                  Message = reply.Status == IPStatus.Success
52                      ? $"Success: RoundTrip time={reply.RoundtripTime}ms; TTL={reply.Options.Ttl}; Data size={buffer.Length} bytes"
53                      : $"Failed: Status={reply.Status}",
54                  RoundTripTime = reply.Status == IPStatus.Success ? reply.RoundtripTime : -1,
55                  Ttl = reply.Status == IPStatus.Success ? reply.Options.Ttl : -1,
56                  DataSize = buffer.Length
57              };
58          }
59      }
60      catch (Exception e)
61      {
62          // 捕獲異常並返回錯誤資訊
63          // Catch any exceptions and return error information
64          return new PingResultInfo
65          {
66              Host = null,
67              Result = false,
68              Message = $"錯誤: {e.Message} Error: {e.Message}"
69          };
70      }
71  }

我們也可以直接PING域名,例如 www.baidu.com

並且可以自動解析出來該域名的IP地址(Host)

如果Ping一個不存在的IP,或者連不上的,例如192.168.0.1

顯示超時,並且Result狀態為false,代表沒連上。狀態值為TimeOut,說明超時了。

應用場景:

該功能可以應用於需要不定時驗證某個遠端主機或裝置或其他機器是否還線上的情況。並根據狀態來展示具體主機是線上還是掉線。

相關文章