C# 实现Ping远程主机功能

ping · 浏览次数 : 0

小编点评

**C#实现Ping远程主机功能** **1.引用 nuget 包** ```csharp using Wesky.Net.OpenToolsOpenTools; ``` **2.创建 PingHelper 类** ```csharp public class PingHelper { // ... } ``` **3.定义 PingResultInfo 类** ```csharp public class PingResultInfo { public string Host { get; set; } public bool Result { get; set; } public string Message { get; set; } public int RoundTripTime { get; set; } public int Ttl { get; set; } public int DataSize { get; set; } } ``` **4.实现 PingHost 方法** ```csharp public static PingResultInfo PingHost(string host, int timeout) { // 解析域名获取 IP 地址 IPAddress[] addresses = Dns.GetHostAddresses(host); // 如果 IP 地址为空,返回错误信息 if (addresses.Length == 0) { return new PingResultInfo { Host = null, Result = false, Message = "No IP addresses resolved" }; } // 使用第一个解析的 IP 地址进行 ping 操作 IPAddress targetIP = addresses[0]; // 创建和返回包含 ping 操作结果的 PingResultInfo 对象 return new PingResultInfo { Host = targetIP, Result = true, Message = "Success: RoundTrip time={reply.RoundtripTime}ms; TTL={reply.Options.Ttl}; Data size={buffer.Length} bytes" }; } ``` **5.使用示例** ```csharp // 调用 PingHost 方法 PingResultInfo result = PingHelper.PingHost("www.baidu.com", 3000); // 打印结果 Console.WriteLine(result.Host); Console.WriteLine(result.Result); Console.WriteLine(result.Message); ``` **注意:** * 该代码需要引用 `Dns` 和 `Ping` 类。 * `Dns.GetHostAddresses()` 方法用于解析域名并返回 IP 地址列表。 * `PingOptions` 类用于设置 ping 操作选项,例如防止数据包被分片。 * `PingResultInfo` 类用于存储 ping 操作结果。

正文

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,说明超时了。

 应用场景:

该功能可以应用于需要不定时验证某个远程主机或设备或其他机器是否还在线的情况。并根据状态来展示具体主机是在线还是掉线。

 

 

 

 

与C# 实现Ping远程主机功能相似的内容:

C# 实现Ping远程主机功能

C#实现Ping远程主机功能。 1、引用nuget包 Wesky.Net.OpenTools OpenTools是一个用于提高开发效率的开源工具库。该项目为个人开源项目,采用MIT开源协议,永不更改协议。开源项目地址: Gitee:https://gitee.com/dreamer_j/open-t

[转帖]ioping测试

https://www.cnblogs.com/ishmaelwanglin/p/10839702.html 一个实时显示磁盘io延时的工具,以类似ping 的输出一样展示输出结果 常用参数: -c count stop after count requests. -i interval Set t

C#实现图片转Base64字符串.并支持markdown文件打开展示

引用1.0.3版本或以上的Wesky.Net.OpenTools 包 1.0.3 版本提供图片转Base64字符串方案,并提供根据后缀名自动识别Mime类型,合成标准URI 开源项目地址: Gitee:https://gitee.com/dreamer_j/open-tools.git Github

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务. I/O 密集型任务. 并发请求处理. 大数据处理等. 什么是

7.1 C/C++ 实现动态数组

动态数组相比于静态数组具有更大的灵活性,因为其大小可以在运行时根据程序的需要动态地进行分配和调整,而不需要在编译时就确定数组的大小。这使得动态数组非常适合于需要动态添加或删除元素的情况,因为它们可以在不浪费空间的情况下根据需要动态增加或减少存储空间。动态数组的内存空间是从堆(heap)上分配的,动态数组需要程序员手动管理内存,因为它们的内存空间是在程序运行时动态分配的。程序员需要在使用完动态数组后

7.2 C/C++ 实现动态链表

动态链表是一种常用的动态数据结构,可以在运行时动态地申请内存空间来存储数据,相比于静态数组和静态链表,更加灵活和高效。在动态链表中,数据元素被组织成一条链表,每个元素包含了指向下一个元素的指针,这样就可以通过指针将所有元素串联起来。使用动态链表存储数据时,不需要预先申请内存空间,而是在需要的时候才向内存申请。当需要添加新的元素时,可以使用`malloc`函数动态地申请内存空间,然后将新的元素插入到

7.3 C/C++ 实现顺序栈

顺序栈是一种基于数组实现的栈结构,它的数据元素存储在一段连续的内存空间中。在顺序栈中,栈顶元素的下标是固定的,而栈底元素的下标则随着入栈和出栈操作的进行而变化。通常,我们把栈底位置设置在数组空间的起始处,这样在进行入栈和出栈操作时,只需要维护栈顶指针即可。顺序栈的实现比较简单,它只需要一个数组和一个整型变量`top`即可。其中,数组用于存储栈中的元素,top则用于记录当前栈顶元素在数组中的位置。当

7.4 C/C++ 实现链表栈

相对于顺序栈,链表栈的内存使用更加灵活,因为链表栈的内存空间是通过动态分配获得的,它不需要在创建时确定其大小,而是根据需要逐个分配节点。当需要压入一个新的元素时,只需要分配一个新的节点,并将其插入到链表的头部;当需要弹出栈顶元素时,只需要删除链表头部的节点,并释放其所占用的内存空间即可。由于链表栈的空间利用率更高,因此在实际应用中,链表栈通常比顺序栈更受欢迎。在实现上,链表栈通过使用`malloc

7.5 C/C++ 实现链表队列

链表队列是一种基于链表实现的队列,相比于顺序队列而言,链表队列不需要预先申请固定大小的内存空间,可以根据需要动态申请和释放内存。在链表队列中,每个节点包含一个数据元素和一个指向下一个节点的指针,头节点表示队头,尾节点表示队尾,入队操作在队尾插入元素,出队操作在队头删除元素,队列的长度由节点数量决定。由于链表队列没有容量限制,因此可以处理任意数量的元素,但是相比于顺序队列,链表队列的访问速度较慢,因

C#实现生成Markdown文档目录树

前言 之前我写了一篇关于C#处理Markdown文档的文章:C#解析Markdown文档,实现替换图片链接操作 算是第一次尝试使用C#处理Markdown文档,然后最近又把博客网站的前台改了一下,目前文章渲染使用Editor.md组件在前端渲染,但这个插件生成的目录树很丑,我魔改了一下换成boots