C#发送PING命令和ICMP数据包监测你的设备是否正常

发送一个小数据包(ICMP)数据到其他计算机,如果连接正常,则会有正常响应,否则会得到一个超时连接错误,这样就说明不能与这台计算机正常连接。
C#实现发送PING,不需要额外的DLL支持,仅需要工程引入System.Net.NetworkInformation命名空间即可,以下是实现代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
 
namespace What21App
{
    public class What21Main
    {
         
        public static void Main(string[] args)
        {
            try
            {   
                // 创建Ping对象
                Ping ping = new Ping();
                //通过发送PING包创建PingReply对象
                PingReply reply = ping.Send("www.*.com", 1000);
                if (reply != null)
                {
                    Console.WriteLine("状态: {0}",reply.Status);
                    Console.WriteLine("时间: {0}",reply.RoundtripTime.ToString() );
                    Console.WriteLine("地址 {0}",reply.Address);
                    Console.WriteLine("响应 {0}",reply.ToString());
                }
            }
            catch(Exception e)
            {
                Console.WriteLine("timeout error: {0}",e);
            }
             
            Console.WriteLine();
            Console.WriteLine("what21.com prompt, Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}

使用:Ping、PingOptions、PingReply等类来实现TraceRoute功能。
我们提供一个IP或者域名作为目标地址,当收到跳数和一个超时值允许我们继续跟踪线路,我就将它记录,时间以毫秒计。

C#通过Ping实现执行tracert命令并处理结果
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP数据包访问目标所采取的路径。Tracert 命令使用用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由.其命令格式如下。

tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name

参考 https://baike.baidu.com/item/TRACERT%E5%91%BD%E4%BB%A4/7680170?fr=kg_qa

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
 
 
    public class TraceRoute
    {
        private const string Data = "111";
 
        /// 
        /// tracert命令
        /// 
        /// 
        /// 
        public static IEnumerable<IPAddress> GetTraceRoute(string hostNameOrAddress)
        {
            return GetTraceRoute(hostNameOrAddress, 1);
        }
 
        /// 
        /// 获取路由表
        /// 
        /// 地址
        /// TTL参数
        /// 
        private static IEnumerable<IPAddress> GetTraceRoute(string hostNameOrAddress, int ttl)
        {
            Ping pinger = new Ping();
            // 创建PingOptions对象
            PingOptions pingerOptions = new PingOptions(ttl, true);
            int timeout = 10000;
            byte[] buffer = Encoding.ASCII.GetBytes(Data);
            // 创建PingReply对象
            PingReply reply = default(PingReply);
            // 发送ping命令
            reply = pinger.Send(hostNameOrAddress, timeout, buffer, pingerOptions);
             
            // 处理返回结果
            List<IPAddress> result = new List<IPAddress>();
            if (reply.Status == IPStatus.Success)
            {
                result.Add(reply.Address);
            }
            else if (reply.Status == IPStatus.TtlExpired || reply.Status == IPStatus.TimedOut)
            {
                //增加当前这个访问地址
                if (reply.Status == IPStatus.TtlExpired)
                {
                    result.Add(reply.Address);
                } 
                //递归访问下一个地址
                IEnumerable<IPAddress> tempResult = default(IEnumerable<IPAddress>);
                tempResult = GetTraceRoute(hostNameOrAddress, ttl + 1);
                result.AddRange(tempResult);
            }
            else
            {
                //失败
            }
            return result;
        }
    }
 

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;

public class Demo
{
    static void Main(string[] args)
    {


        IEnumerable enumer = TraceRoute.GetTraceRoute("www.*.com");
        foreach (IPAddress ip in enumer)
        {
            Console.WriteLine(ip);
        }
        Console.WriteLine();
        Console.WriteLine("what21.com prompt, Press any key to continue . . . ");
        Console.ReadKey(true);

    }

}

你可能感兴趣的:(C#)