百度搜索的方案

如果你去百度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. Grafana 系列-统一展示-4-AWS Cloudwatch 数据源

    系列文章 Grafana 系列文章 AWS Cloudwatch 数据源 对于 AWS Cloudwatch, 主要在于 3 种不同的认证方式: AWS SDK Default IAM Role AK ...

  2. Perm 排列计数——Lucas&dfs

    思路:这道题给出的公式看明白后即可得出正解,我们可以把他想象成一颗二叉树,任意一个点的任意一个子孙一直除以2后最终都会到达一终点,终点则为以该点为根的子树的最小值. so--我们可以将根节点作为最后终 ...

  3. Access Single User Mode (Reset Root Password)--CentOS 修改root密码

    Access Single User Mode (Reset Root Password) Published on: Wed, Sep 17, 2014 at 12:52 pm EST FAQ  L ...

  4. 英语 one day

    前言 I do not know if it work,but just go. 内容 1.quote vt:摘要,引用 n:引语 He quote a passage from the presid ...

  5. 重新点亮linux 命令树————查看进程[二十一]

    前言 简单介绍一下进程. 正文 进程管理: 进程的概念与进程查看 进程的控制命令 进程的通信方式---信号 守护进程和系统日志 服务管理工具 systemctl SELinux 简介 进程概念: ht ...

  6. 鸿蒙HarmonyOS实战-ArkUI组件(Canvas)

    一.Canvas Canvas组件是一种图形渲染组件,它提供了一个画布(canvas),开发者可以在上面绘制各种图形.文本等.Canvas组件通常用于创建游戏.数据可视化等需要动态绘制图形的应用程序. ...

  7. threading的定时器模块,python,每间隔一段时间执行一次任务

    工作中常有一些定时任务要处理,比如使用百度的接口,它的access_token是一个更新一次的,每次使用时总是请求会很慢,所以我们把它保存起来,用定时器模块,定时在过期之前请求一次,或者定时数据同步, ...

  8. 力扣233(java)-数字1的个数(困难)

    题目: 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数. 示例 1: 输入:n = 13输出:6示例 2: 输入:n = 0输出:0 提示: 0 <= n <= ...

  9. 持续定义Saas模式云数据仓库+BI

    云数据仓库概述 今天和大家一起探讨一下我们Saas模式下云数据仓库加上商业智能BI能有什么新的东西出来.我们先来看一下云数据仓库的一些概述.预测到2025年, 全球数据增长至175ZB, 中国数据量增 ...

  10. 走完线上 BUG 定位最后一公里

    简介: 因为线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,定位 bug 效率低下.是否有简单快捷的办法呢? 一个小故事 周末12点的闹钟在回龙观均价3000的出租屋急促的响起,程序员 ...