百度搜索的方案

如果你去百度C#如何获取本机IP,那么大概率的你会得到以下的几段代码,第一种就是这样:

string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);

或者这样:

        public static void GetLoacalIPMaybeVirtualNetwork()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
Console.WriteLine(ip.ToString());
}
}
}

这种写法本身没有问题,但是当你的电脑上有多个网卡,比如vmare虚拟的的网卡,那么你会得到一列的IP数据,没有办法得到这些IP那个是你正在使用的IP。

就像这样

这时网上的代码就会给你第二种的参考代码即让你去访问一个网站获取或者使用ipconfig命令来获取IP。

这种方式没有什么问题,但是如果使用访问网站的方式,那么你可能获取到的是运营商分配的IP而不是本机局域网的IP。在一些需要访问本机局域网的的应用下就不太适用。

所以我个人认为这些方案都不是特别好。

我的方案

C#在其System.Net.NetworkInformation包下有一个NetworkInterfaceType的枚举类,在这个枚举类下定义了多种的网络类型。

比如网络接口使用以太网连接。以太网是在IEEE中定义的 802.3类型的Ethernet,再比如网络接口使用无线LAN连接(IEEE 802.11标准)的类型Wireless80211

通过这个枚举类,我们就能判断该网络IP所属的类型。

然后我们就可以通过使用抽象类NetworkInterface提供的GetAllNetworkInterfaces获取所有的网络接口,之后再通过判断NetworkInterfaceType网络接口类型,来获取正在使用真正的局域网IP。

具体代码如下:

        public static string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
// 网络类型是所规定的并且网络再运行状态
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}

这时,我们就可以根据网络类型来获取相应的IP,鉴于当前大多数人使用的都是无线网卡,那么我们就可以先从无线网卡来获取IP地址。

        public static string IPV4()
{
string ipv4 = GetLocalIPv4(NetworkInterfaceType.Wireless80211);
// 如果不是无线网卡,则获取有线网卡的地址
if (ipv4 == "")
{
ipv4 = GetLocalIPv4(NetworkInterfaceType.Ethernet);
// 如果有线网卡也没有获取到数据,则使用最开始可能包含虚拟网卡的方法来获取IP
if (ipv4 == "")
{
ipv4 = GetLoacalIPMaybeVirtualNetwork();
}
}
return ipv4;
}

这样我们就能获取到本机目前使用的局域网IP了。

另外,推荐在使用获取IP的方法之前,先使用NetworkInterface.GetIsNetworkAvailable()方法来判断一下网络是否连接,确保后期获取IP不会出错。

END

版权信息:本文首发于https://www.buguagaoshu.com 转载请注明来源

C# 如何获取本机IP的更多相关文章

  1. 获取本机IP地址

    这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

  2. python未知网卡名情况下获取本机IP

    import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...

  3. 关于是用dotnet获取本机IP地址+计算机名的方法

    印象中在maxscript帮助文档里找到过方法,但是当时没记下来.只能通过dotnet实现了. 如果电脑有无线网卡和本地连接,可能会出现乱码,也问了写dotnet的朋友,提供了一些思路,不过最终还是使 ...

  4. Windows下获取本机IP地址方法介绍

    Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...

  5. python学习之最简单的获取本机ip信息的小程序

    文章是从我的个人博客粘贴过来的,大家可以直接访问我的个人博客哦 http://www.iwangzheng.com 获取本机ip信息的命令ifconfig总是在用,这次拿到pyhton代码里,感觉py ...

  6. java获取本机IP地址

    转载自:http://blog.csdn.net/thunder09/article/details/5360251 在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一 ...

  7. #获取本机IP地址时排除IPv6类型,只返回IPv4地址的方法

    public static string GetLocalIP(){try{string HostName = Dns.GetHostName(); //得到主机名IPHostEntry IpEntr ...

  8. 获取本机IP、mac地址、计算机名

    python获取本机IP.mac地址.计算机名 在python中获取ip地址和在php中有很大不同,我们先来看一下python 获得本机MAC地址: >>> import uuid ...

  9. C# 获取网页数据、获取本机IP 分类: C# 2014-12-16 14:59 308人阅读 评论(0) 收藏

    说明: (1) http://www.3322.org/dyndns/getip 这个网址可以获取本机IP,读取的内容就是本机IP (2)方法经测试,可以实现. (3)参考:http://www.cn ...

  10. C#获取本机IP搜集整理7种方法

    今天打算试着写个小聊天程序,但是要用到获取本机IP,以前从没用过.摆渡百度了一会儿,出于贪心,想把各种获取本机IP的方法给找出来.摆渡+测试了几个小时,于是有了下面的成果,有点小累,但看到这些成果,也 ...

随机推荐

  1. C 语言运算符详解

    C 语言中的运算符 运算符用于对变量和值进行操作. 在下面的示例中,我们使用 + 运算符将两个值相加: int myNum = 100 + 50; 虽然 + 运算符通常用于将两个值相加,就像上面的示例 ...

  2. HMS Core手语服务荣获2022中国互联网大会“特别推荐案例”:助力建设数字社会

    11月15日,HMS Core手语服务在2022(第二十一届)中国互联网大会 "互联网助力经济社会数字化转型"案例评选活动中,荣获"特别推荐案例". 经过一年多 ...

  3. Python删除文件、文件夹----os

    使用 os  删除文件 import os '''删除文件 语法: os.unlink(path) 示例: 删除 b 文件夹中的 12.txt ''' os.unlink('b/12.txt')   ...

  4. Spring Cloud 核心组件之Spring Cloud Zuul:API网关服务

    Spring Cloud Zuul:API网关服务 SpringCloud学习教程 SpringCloud API网关 Spring Cloud Zuul 是Spring Cloud Netflix ...

  5. CentOS 8 安装更新国内清华大学源手记【亲测成功】

    一直和各种OS打交道,仍觉得自己是小白,故深知小白们的困惑和蛋碎,特此将安装更新源的细节和步骤做了详细整理,供大家参考.红字是命令和提示,深灰色代码框中是源配置,本文采用了清华大学CentOS 8的源 ...

  6. 重新整理 .net core 实践篇————防跨站脚本攻击[四十]

    前言 简单整理一下跨站脚本攻击. 正文 攻击原理是这样子的: 这种攻击被攻击的面挺多的,比如说只要有一个可以让用户输入的注入脚本就都是一个问题. 给网站注入脚本 然后用户访问给网站注入的脚本 脚本里面 ...

  7. Mysql安装和远程登录--Centos7

    在Centos7中使用的包管理工具是yum,当然使用包管理工具安装也是最方便的. 本文操作内容需要在root用户下,否则有些步骤无法成功执行. 系统环境信息展示 安装 MySQL 提供的 RPM wg ...

  8. esp8266,arduino,网页显示dht11温湿度,控制继电器开关,局域网智能家居

    不说了,上代码,用arduino实现esp8266代码 #include <ESP8266WiFi.h> #include <WiFiClient.h> #include &l ...

  9. DDD领域驱动设计总结和C#代码示例

    DDD(领域驱动设计)是一种软件设计方法,它强调以业务领域为核心来驱动软件的设计和开发. DDD 的设计初衷是为了解决复杂业务领域的设计和开发问题,它提供了一套丰富的概念和模式,帮助开发者更好地理解和 ...

  10. What is an HL7 ADT Message?

    Patient Admission Discharge and Transfer (ADT) messages are used to exchange the patient state withi ...