C#实现Ping远程主机功能(支持IP和域名)
共 3777字,需浏览 8分钟
·
2024-05-30 08:00
项目上引用nuget包 Wesky.Net.OpenTools(包同时兼容.net standard2.0和2.1,可以被.net framework4.6.1+环境引用和所有.net core和.net 5以上版本引用)
OpenTools是一个致力于给.NET开发者提高开发效率的开源工具库。该项目为个人开源项目,采用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,说明超时了。
应用场景:
该功能可以应用于需要不定时验证某个远程主机或设备或其他机器是否还在线的情况。并根据状态来展示具体主机是在线还是掉线。