C#获取本地IP的四种方式示例详解
作者:Koalin 发布时间:2023-04-16 00:52:50
标签:C#,IP,地址
1.第一种方式
采用System.Net.Dns的GetHostAddress的方式,具体请看代码:
/// <summary>
/// 网络不通畅可以获取
/// 不过能获取到具体的IP
/// </summary>
/// <returns></returns>
public static List<IPAddress> GetByGetHostAddresses()
{
try
{
IPAddress[] adds = Dns.GetHostAddresses(Dns.GetHostName());
return adds == null || adds.Length == 0 ? new List<IPAddress>() : adds.ToList<IPAddress>();
}
catch (Exception)
{
return new List<IPAddress>();
}
}
这种方式受到网络的影响,如果没有连接到网络,本地配置的部分IP是获取不到的,我也遇到一种情况是,电脑环境正常,就是获取不到,原因至今还不知道;
2.第二种方式
采用System.Management.ManagementClass来获取,详细请看代码:
/// <summary>
/// 只有网络通畅才能获取
/// </summary>
/// <returns></returns>
public static List<IPAddress> GetByManagementClass()
{
try
{
ManagementClass mClass = new System.Management.ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection managementObjectCollection = mClass.GetInstances();
List<IPAddress> ls = new List<IPAddress>();
foreach (var item in managementObjectCollection)
{
if ((bool)item["IPEnabled"] == true)
{
foreach (var ip in (string[])item["IPAddress"])
{
IPAddress ipout = null;
IPAddress.TryParse(ip, out ipout);
if (ipout != null)
{
ls.Add(ipout);
}
}
}
}
return ls;
}
catch (Exception)
{
return new List<IPAddress>();
}
}
同样的这种方式也受到网络的约束,没有联网的状态下不一定能够获取到IP;
3.第三种方式
我们平时在命令行中输入ipconfig命令同样也是能获取,在程序中启动Ipconfig应用程序,然后解析出来,也是可以获取得到IP,详细请看代码:
public static List<IPAddress> GetByCMD()
{
try
{
Process cmd = new Process();
cmd.StartInfo.FileName = "ipconfig.exe";
cmd.StartInfo.Arguments = "/all";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.Start();
string info = "";
List<IPAddress> ls = new List<IPAddress>();
// info = cmd.StandardOutput.ReadToEnd();
Regex validipregex = new Regex(@"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}");
//new Regex(@"^(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
while ((info = cmd.StandardOutput.ReadLine()) != null)
{
IPAddress ip = null;
Console.WriteLine(info);
info = validipregex.Match(info).Value;
IPAddress.TryParse(info, out ip);
if (ip != null)
{
ls.Add(ip);
}
}
cmd.WaitForExit();
cmd.Close();
return ls;
}
catch (Exception)
{
return new List<IPAddress>();
}
}
即便是通过这种方式来获取IP,如果在本机电脑没有联网的状态下,也是获取不到IP的,并且也不太建议使用这种方式;
4.第四种方法
采用NetworkInterface.GetAllNetworkInterfaces的方式是不受网络的影响的,联网或者不联网都能够获取到IP,详细请看代码:
/// <summary>
/// 无论网络通不通都能获取到Ip
/// </summary>
/// <returns></returns>
public static List<IPAddress> GetByNetworkInterface()
{
try
{
NetworkInterface[] intf = NetworkInterface.GetAllNetworkInterfaces();
List<IPAddress> ls = new List<IPAddress>();
foreach (var item in intf)
{
IPInterfaceProperties adapterPropertis = item.GetIPProperties();
UnicastIPAddressInformationCollection coll = adapterPropertis.UnicastAddresses;
foreach (var col in coll)
{
ls.Add(col.Address);
}
}
return ls;
}
catch (Exception)
{
return new List<IPAddress>();
}
}
以上所说的联网,包括连接在局域网中。
希望给有需要的朋友们带来帮助;
来源:https://www.cnblogs.com/hglSV/p/10759468.html


猜你喜欢
- 前言前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会"。至于为啥会有很多
- JAVA并发编程有界缓存的实现1、有界缓存的基类package cn.xf.cp.ch14;/** * *功能:有界缓存实现基类 *时间:
- 可以指定编码如:utf-8来写入和读取文件。如果文件编码未知,可以通过该方法先得到文件的编码后再指定正确的编码来读取,否则会出现文件乱码问题
- 一、前言高效、合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑。接下来会介绍一下常用一
- 目录一 、EasyExcel简介二、常用注解三、依赖四、监听五、接口导入Excel六、接口 导出Excel (HttpServletResp
- 本文实例为大家分享了java将一个目录下的所有文件复制n次的具体代码,供大家参考,具体内容如下1. 文件复制示意图 2.java程
- 在上一篇文章中完成了 《Maven镜像地址大全 》,后来又花了时间又去收集并整理了关于 maven 远程仓库地址,并整理于此,关于 Mave
- 本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下:using System;using System.
- 使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。步骤:1).
- 字符串的编码方式UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5
- 本文实例讲述了C#实现的ZPL条码打印类。分享给大家供大家参考,具体如下:using System;using System.Collect
- 扩展阅读c#基础系列1---深入理解 值类型和引用类型c#基础系列2---深入理解 String引言在上篇文章深入理解值类型和引用类型的时候
- 引言什么是Parser CombinatorParser Combinator是函数式语言中的概念,它是一种通过组合小型解析器来构建复杂解析
- 一、定义责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都
- 在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去。如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些
- 一、abstract 抽象的抽象类:被abstract 修饰的类语法: abstract class 类名{}抽象方法 : 被a
- 前言工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段。当然你使用线程计数可以实现,只是不够优
- 本文实例讲述了C#实现合并多个word文档的方法,是非常具有实用价值的技巧。分享给大家供大家参考。具体实现方法如下:using System
- 先上结论RPC请求的效率是HTTP请求的1.6倍左右,性能明显比HTTP请求要高很多。原因分析RESTful是基于HTTP协议进行交互的,H
- 一、项目简述(+需求文档+PPT)功能: 主页显示热销商品;所有商品展示,可进行商品搜索;点 击商品进入商品详情页,显示库存,具有立即购买和