C#获取Network的相关信息

news2024/9/23 5:23:54

1,获取网络的通断。

//方法1:无效果,并不能反映当前网络通断
bool available=System.Windows.Forms.SystemInformation.Network

//方法2:通过VB获取网络状态,可反映当前网络通断
Microsoft.VisualBasic.Devices.Network network = new Microsoft.VisualBasic.Devices.Network();
bool available=network.IsAvailable;

//方法3,可反映当前网络通断
bool available=System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

2,自定义获取Host IP ,Mac,局域网内活动IP与Mac的类。

 /// <summary>
    /// 本机网络连接类
    /// </summary>
    class NetworkInfo
    {
        /// <summary>
        /// 是否有网络连接
        /// </summary>
        public bool Available
        {
            get
            {
                return NetworkInterface.GetIsNetworkAvailable();
            }
        }
        /// <summary>
        /// 获取主机上在用的IP信息集合
        /// </summary>
        /// <returns></returns>
        public NetworkAddress[] GetHostNetworkAddress()
        {
            List<NetworkAddress> list = new List<NetworkAddress>();
            foreach (var item in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (item.OperationalStatus == OperationalStatus.Up)
                {
                    if (item.NetworkInterfaceType == NetworkInterfaceType.Ethernet || item.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
                    {
                        NetworkAddress info = new NetworkAddress();
                        info.Description = item.Description;
                        foreach (var t in item.GetIPProperties().UnicastAddresses)
                        {
                            if (t.Address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                info.IPv4Address = t.Address.ToString();
                            }
                            if (t.Address.AddressFamily == AddressFamily.InterNetworkV6)
                            {
                                info.IPv6Address = t.Address.ToString();
                            }
                        }
                        string physical = item.GetPhysicalAddress().ToString();
                        if (physical != null && physical.Length > 0)
                        {
                            List<string> tempList = new List<string>();
                            for (int i = 0; i < physical.Length; i += 2)
                            {
                                tempList.Add(physical.Substring(i, 2));
                            }
                            physical = string.Join("-", tempList);
                        }
                        info.PhysicalAddress = physical;
                        list.Add(info);
                    }
                }
            }
            return list.ToArray();
        }
        /// <summary>
        /// 获取局域网上所有活动的IP与Mac(耗时长)
        /// </summary>
        /// <param name="ipv4">ipv4格式的IP 地址</param>
        /// <returns></returns>
        public async Task<NetworkAddress[]> ScanLocalAreaNetworkAsync(string ipv4)
        {
            //格式验证
            if (!System.Text.RegularExpressions.Regex.IsMatch(ipv4, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
            {
                throw new ArgumentException("格式错误,不是有效的IP地址", nameof(ipv4));
            }
            string networkNumber = ipv4.Remove(ipv4.LastIndexOf('.'));
            await Task.Run(() =>
            {
                // for / L % i IN(1, 1, 254) DO ping - w 2 - n 1 192.168.0.% i
                var result = RunDOS($"for /L %i IN (1,1,254) DO ping -w 1 -n 1 {networkNumber}.%i");
            });
            //获取局域网中活动的IP命令:arp -a
            string msg = RunDOS("arp -a");
            //  string msg = RunDOS("ipconfig/all");
            var arr = System.Text.RegularExpressions.Regex.Matches(msg, @"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\w[0-9a-z\-]+)\s");
            List<NetworkAddress> list = new List<NetworkAddress>();
            foreach (System.Text.RegularExpressions.Match item in arr)
            {
                if (item.Groups.Count == 3)
                {
                    NetworkAddress netip = new NetworkAddress
                    {
                        IPv4Address = item.Groups[1].Value,
                        PhysicalAddress = item.Groups[2].Value
                    };
                    list.Add(netip);
                }
            }
            return list.ToArray();
        }
        /// <summary>
        /// 通过Ping获取活动的Local Area Network IPv4地址
        /// </summary>
        /// <param name="ipv4"></param>
        /// <returns></returns>
        public NetworkAddress[] ScanLocalAreaNetwork(string ipv4)
        {
            //格式验证
            if (!System.Text.RegularExpressions.Regex.IsMatch(ipv4, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
            {
                throw new ArgumentException("格式错误,不是有效的IP地址", nameof(ipv4));
            }
            string networkNumber = ipv4.Remove(ipv4.LastIndexOf('.'));
            List<NetworkAddress> list = new List<NetworkAddress>();
            Ping ping = new Ping();
            for (int i = 1; i < 255; i++)
            {
                string targetIp = $"{networkNumber}.{i}";
                PingReply reply = ping.Send(targetIp, 1000);
                if (reply.Status == IPStatus.Success)
                {
                    NetworkAddress net = new NetworkAddress
                    {
                        IPv4Address = reply.Address.ToString(),
                        PhysicalAddress = GetMacAddress(reply.Address.ToString())
                    };
                    list.Add(net);
                }
            }
            return list.ToArray();
        }
        /// <summary>
        /// 获取公网IP
        /// </summary>
        /// <returns></returns>
        public string GetPublicNetworkIp()
        {
            if (!Available)
            {
                return "网络断开,无可用网络!";
            }
            try
            {
                WebClient client = new WebClient();
                string querySite = "https://qifu-api.baidubce.com/ip/local/geo/v1/district";
                client.Encoding = Encoding.UTF8;
                string result = client.DownloadString(querySite);
                dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
                string msg = $"{json.data.owner} {json.data.prov} {json.data.city} {json.ip}";
                return msg;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
        /// <summary>
        /// 运行Dos指令
        /// </summary>
        /// <param name="cmdStr">DOS命令</param>
        /// <returns></returns>
        private string RunDOS(string cmdStr)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "cmd.exe";
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            Process p = Process.Start(startInfo);
            //注意这里需要使用writeLine,因为这个带有回车符代表执行
            p.StandardInput.WriteLine(cmdStr);
            p.StandardInput.Close();
            string result = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return result;
        }
        public static string GetMacAddress(string RemoteIP)
        {
            StringBuilder macAddress = new StringBuilder();
            try
            {
                Int32 remote = inet_addr(RemoteIP);
                Int64 macInfo = new Int64();
                Int32 length = 6;
                SendARP(remote, 0, ref macInfo, ref length);
                string temp = Convert.ToString(macInfo, 16).PadLeft(12, '0').ToUpper();
                int x = 12;
                for (int i = 0; i < 6; i++)
                {
                    if (i == 5)
                    {
                        macAddress.Append(temp.Substring(x - 2, 2));
                    }
                    else
                    {
                        macAddress.Append(temp.Substring(x - 2, 2) + "-");
                    }
                    x -= 2;
                }
                return macAddress.ToString();
            }
            catch
            {
                return macAddress.ToString();
            }
        }
        [DllImport("Iphlpapi.dll")]
        static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 MacAddr, ref Int32 PhyAddrLen);
        [DllImport("Ws2_32.dll")]
        static extern Int32 inet_addr(string ipaddr);
        ///<summary>
        /// SendArp获取MAC地址
        ///</summary>
        ///<param name="RemoteIP">目标机器的IP地址如(192.168.1.1)</param>
        ///<returns>目标机器的mac 地址</returns>
    }
    class NetworkAddress
    {
        /// <summary>
        /// IPv4地址
        /// </summary>
        public string IPv4Address { get; set; }
        /// <summary>
        /// IPv6地址
        /// </summary>
        public string IPv6Address { get; set; }
        /// <summary>
        /// 物理地址
        /// </summary>
        public string PhysicalAddress { get; set; }
        public string Description { get; set; }
    }

3,效果:

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

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

相关文章

Qt QML 使用QPainterPath绘制弧形曲线和弧形文本

Qt并没有相关api直接绘制弧形文字&#xff0c;但提供了曲线绘制相关类&#xff0c;所以只能另辟蹊径&#xff0c;使用QPainterPath先生成曲线&#xff0c;然后通过曲线上的点来定位每个文字并draw出来。 QML具体做法为从QQuickPaintedItem继承&#xff0c;在派生类中实现paint…

Linux 系统框架分析(一)

一、linux内核结构框图 对内核结构框图有个总体的把握&#xff0c;有助于理解为什么驱动要这样写&#xff0c;为什么写的应用程序所用的C库接口能够产生这么多的事情。 框图可以看出来&#xff0c;linux系统&#xff0c;包括五个系统 一、Linux内核结构介绍 Linux 内核是操作…

【机器学习基础】线性回归

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

Flutter 生成图表(fl_chart)

Flutter 图表 使用fl_chart 先看最终效果 实现抖音’使用管理助手’效果 需求分析&#xff1a;统计每个用户近7天每天的使用时长&#xff08;从当天往后推导&#xff0c;假设今天周二&#xff09;&#xff0c;单位为分钟或者小时&#xff0c;根据平均时长决定 技术选型&…

Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络回归模型(CNN-BiLSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着深度学习技术的发展&#xff0c;尤其是卷积神经网络&#xff08;Convolutional Neural Networks, …

Android Studio 连接手机进行调试

总所周知&#xff0c;Android Studio里的虚拟手机下载后又大又难用。不如直接连手机用。本篇文章主要内容为Android Studio怎么连接手机进行程序调试。 1. 在AndroidSDK中下载google USB Driver: 2. 连接手机&#xff1a; 进入电脑设备管理器界面。并点开便携设备&#xff0c…

wakanda:1靶机渗透测试

一、靶机下载地址 https://download.vulnhub.com/wakanda/wakanda-1.ova 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.222.0/24 -sn | grep -B 2 "08:00:27:ED:98:E1" 2、端口扫描 # 使用命令 nmap 192.168.222.149 -p- -sV 3、指纹识别 # 使用命令 wha…

C++相关概念和易错语法(25)(列表初始化、initializer_list)

列表初始化是C11中新增的初始化规则&#xff0c;大大增强了初始化的灵活性&#xff0c;在本篇文章中&#xff0c;我会详细讲解列表初始化的各种使用场景。 1.从C语言初始化语法开始改变——不带赋值号的初始化方式 列表初始化可以说是将C语言的一些初始化语法进行放大的结果。…

c++习题18-计算鞍点

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 给定一个55的矩阵&#xff0c;每行只有一个最大值&#xff0c;每列只有一个最小值&#xff0c;寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素&#xff0c;它是所在行的最大值&#x…

海外短剧小程序 ,竖屏会员付费看剧系统搭建paypal,stripe对接支付功能

目录 前言&#xff1a; 一、系统功能 二、系统常见问题 总结&#xff1a; 前言&#xff1a; 在全球化的今天&#xff0c;短剧作为一种新兴的内容形式&#xff0c;正迅速赢得国际观众的心。尤其是海外市场的短剧推广&#xff0c;正成为内容创作者和营销者的新宠。本文将深入…

AWS云服务器选择最佳区域

2024年&#xff0c;随着全球云计算的持续发展和AWS在全球不断扩展的数据中心网络&#xff0c;选择合适的AWS云服务器区域成为了企业和开发者需要认真考虑的问题。九河云告诉你在做出选择之前&#xff0c;需要考虑以哪些关键因素&#xff1a; 地理位置和用户分布 选择AWS云服务…

06:【stm32】OLED模块的简单使用

OLED模块的简单使用 OLED简单的使用 OLED简单的使用 OLED驱动函数是使用B站UP江科大的。我们直接调用即可&#xff0c;是使用软件模拟I2C协议进行通信的。具体的I2C协议可查看上官嵌入式开发中的C51单片机开发。 驱动函数文件&#xff1a;通过百度网盘分享的文件&#xff1a;…

ShardingSphere之ShardingProxy集群部署

文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置&#xff0c;就是关于集群部署的 mode: # typ…

JAVA 封装一个工具类,将实例的里面的空值设为对应的默认值

JAVA 封装一个工具类&#xff0c;将实例的里面的空值设为对应的默认值&#xff0c;比喻字符串类型就设为默认 "", Integer就设为0 示例代码&#xff1a; protected static void setDefaults(Object obj) {Class<?> clazz obj.getClass();Field[] fields …

如何在FreeRtos工程中添加驱动调用

前言&#xff1a;本篇笔记学习的是韦东山老师的教程&#xff0c;连接放在最后。 上篇教程图文讲解了&#xff0c;如何使用STM32CubleMX&#xff0c;进行移植FreeRtos工程&#xff0c;如果没有使用这个软件则需要自己去手动进行移植操作&#xff0c;本篇图文教程是添加驱动&…

LeetCode.3132.找出与数组相加的整数II

题目描述&#xff1a; 给你两个整数数组 nums1 和 nums2。 从 nums1 中移除两个元素&#xff0c;并且所有其他元素都与变量 x 所表示的整数相加。如果 x 为负数&#xff0c;则表现为元素值的减少。 执行上述操作后&#xff0c;nums1 和 nums2 相等 。当两个数组中包含相同…

【探索数据结构与算法】使用单链表实现队列

目录 一. 队列的定义 二.队列的结构定义 单个元素的结构定义 队列的结构定义 三.队列的接口实现 1.初始化 2.销毁 3.入队列&#xff08;队尾插入&#xff09; 4.出队列&#xff08;队头删除&#xff09; 5.获取队首元素 6.获取队尾元素 7.获取队列元素个数 …

力扣刷题-环形链表II

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们先来看一下这道题的代码部分&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListN…

element table表格树形数据展示

element table表格树形数据展示 1、效果 2、代码 <el-table ref"pointMultipleTable" border class"table-box" :data"[damActiveObj]"row-key"id" :tree-props"{ children: children }" :expand-row-keys"expand…

Qt+TSC打印机调试

前言 最近被TSC打印机整的死去活来&#xff0c;记录一下使用方法。 一、环境 Qt5.15.2 mingw tsc TE244 二、使用步骤 1.引入库 从官网下载windows C SDK&#xff0c;引入库&#xff0c;以下是.pro文件 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4)…