C# 如何获取本机IP

文章介绍了在C#中通过NetworkInterfaceType枚举和NetworkInterface类来精确获取本机正在使用的局域网IP地址,避免了多个网卡或虚拟网卡导致的IP选择问题。首先尝试从无线网卡获取,如果未找到再尝试有线网卡,最后才使用传统方法。建议在获取IP前检查网络是否可用。
摘要由CSDN通过智能技术生成

百度搜索的方案

如果你去百度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。

就像这样

image

这时网上的代码就会给你第二种的参考代码即让你去访问一个网站获取或者使用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 转载请注明来源

上一篇快速入门PaddleOCR,并使用其开发一个搜题小工具

下一篇.Net 如何修改 HttpHeaders 中的 Content-Disposition

本文作者:陕西颜值扛把子

本文链接:https://www.cnblogs.com/puzhiwei/p/15229428.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

分类:

标签: ,

[好文要顶](javascript:void(0)😉 [关注我](javascript:void(0)😉 [收藏该文](javascript:void(0)😉 [img](javascript:void(0)😉 [img](javascript:void(0)😉

img

陕西颜值扛把子
粉丝 - 9 关注 - 0

[+加关注](javascript:void(0)😉

0

0

« 上一篇: 快速入门PaddleOCR,并使用其开发一个搜题小工具
www.cnblogs.com/puzhiwei/p/15227450.html)上一篇: 快速入门PaddleOCR,并使用其开发一个搜题小工具
» 下一篇: .Net 如何修改 HttpHeaders 中的 Content-Disposition

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值