C# 实现Ping远程主机功能

news/2024/9/28 4:23:56

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

 应用场景:

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

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

采用flex布局,父组件width为百分比,解决子组件canvas画布width自适应问题

创建EleResize.js文件(拷贝以下代码即可)var EleResize = {_handleResize: function (e) {var ele = e.target || e.srcElementvar trigger = ele.__resizeTrigger__if (trigger) {var handlers = trigger.__z_resizeListenersif (handlers) {var size = handlers.lengthfor …

VMware SD-WAN 6.0 发布(含下载) - 领先的 SD-WAN 解决方案

VMware SD-WAN 6.0 发布(含下载) - 领先的 SD-WAN 解决方案VMware SD-WAN 6.0 发布(含下载) - 领先的 SD-WAN 解决方案 VMware VeloCloud SD-WAN, 全球 SD-WAN 领导者 请访问原文链接:https://sysin.org/blog/vmware-sd-wan-6/,查看最新版。原创作品,转载请保留出处。 作…

Copilot - OpenAI与GitHub联合出品的自动代码生成AI+VirtualLCD - 可用于 GUI 移植的 LCD 模拟器

1、AntOS - 适用 8051 的超轻量级实时操作系统 AntOS 是一款超轻量级实时操作系统,抢占式调度极简内核,专门为小型家电及轻量型物联网终端设计,适合在8051为内核的MCU上运行。项目主页: https://gitee.com/zeweni/ant-osAntOS 提供层级服务,可以进行任意裁剪。内核层包含两…

nRF51_Platform - 基于nRF51平台(蓝牙4.0)的轻量级SDK+AliOS Things - 阿里出品轻量级物联网嵌入式操作系统

1、AliOS Things - 阿里出品轻量级物联网嵌入式操作系统 AliOS Things 发布于2017年杭州云栖大会, 是 AliOS 家族旗下的、面向IoT领域的、高可伸缩的物联网操作系统。AliOS Things 致力于搭建云端一体化IoT基础设施,具备极致性能、极简开发、云端一体。项目主页: https://gi…

SciTech-Mathmatics-ProbabilitiesAndStatistics-Distribution-is-all-you-need: 概率统计到深度学习

Distribution-is-all-you-need 概率统计到深度学习,四大技术路线图谱,都在这里! https://github.com/graykode/distribution-is-all-you-need 自然语言处理路线图: 数学基础 -> 语言基础 -> 模型和算法 项目作者:Tae-Hwan Jung, Github:graykode, 2019-09-30 13:35,…

gcov - 标准c/c++代码覆盖率测试工具+lcov - GCC测试覆盖率的前端图形展示工具+gprof - 标准c/c++代码性能分析工具

1、advent-calendar-of-circuits-2020 - 一个月每天用KiCad设计一个PCB项目 Gregory Davill 是来自澳大利亚的一个技术牛人,在开源硬件领域非常有名且活跃。他在2020年12月坚持每一天设计一个电路板,用 KiCad 完成电路设计到 PCB 的布局布线完成,这便是 advent-calendar-of-…

lua~基本语法

学习 Lua 的必要性nginx开发 apisix,kong插件开发语言特点语句结束没有分号 跟 JavaScript 很像 默认定义的是全局变量,定义局部变量需要加 local 关键字 数组索引从1开始 没有 i++ 操作符号,只能 i = i + 1注释单行注释-- 注释内容多行注释--[[注释内容]]--内置数据类型 总共…

lua~IDEA中调试lua脚本

开发工具IDE工具:jetbrain IDEA 工具插件:EmmyLua本机lua项目和调试lua文件添加lua项目模板,安装完EmmyLua插件就有了添加模板项目后,在项目中添加lua类型的文件为lua项目添加一个编译调试器在调试器中,配置lua和lua项目的信息现在就可以输出hell world了MobDebug pkulche…