C#自动选择出系统中最合适的IP地址

写这个是因为很长时间以来,碰到过很多次这个问题,但都没当回事,这次又碰到了这个老问题,无奈百度了一圈儿未果,身边又没有大牛可以请教,就自己先“总结”了一套方法,一来给自己记录,二来如果碰巧能有朋友看到并为他解决了同样的困扰我将感到很爽。

起因:凡是网络程序,Coder似乎不可避免要碰到,你的代码如何在不同的机器上挑选出最合适的那个IP来通讯,因为如果打开一个应用程序让用户来选择用哪个IP地址和端口来通讯似乎就代表着这是个多么低端的程序,多么低能的程序员,所以一定要自动选择,用户 0 感知,就像伟大的QQ那样。我也再次碰到了这个事情,Q群未果百度未果,就自己用 Framework 中提供的方法和属性,自己总结了一个“规则”,下面直奔主题。

现在的机器可能是双网卡,可能因为各类软件和驱动又有多个虚拟网卡,所以我的“规则”是不直接判断 IP 是不是符合规定,而是先从 NetworkInterface 入手,下面总结一下:

1. 获取所有本地 NetworkInterface 对象;

2. 其属性 Type 最好为 Wireless80211、Ethernet、Fddi、Ppp等,因为根据 MSDN 的解释这几类会是普通家用电脑常见的接口类型,但这样判断不太准确,所以只作为辅助判断条件;

3. 其属性 OperationalStatus 应该为 Up,根据 MSDN 解释,仅在 Up 时表示该网络接口是可以正常收发数据的,这也可以作为判断网卡(网络)是否可用的一个条件;

4. 使用 GetIPProperties().UnicastAddresses 方法,获取该网络接口下所有单播地址,这可以让你获得网络IP;

5. 该IP的DuplicateAddressDetectionState属性应该为 Preferred,表示地址有效,即IP地址可正常使用;

6. 该IP的属性 PrefixOrigin 其值应该为 Dhcp 或 Manual,表示IP前缀由 Dhcp 分配或手动指定;

7. 该IP的属性 SuffixOrigin 其值应该为 OriginDhcp 或 Manual,表示IP后缀由 DHCP 分配或手动指定;

综上所述,基本可以排除一些如 169 、127.0.0.1 等此类的特殊地址,还有一些乱七八糟不知有什么用的网络接口(有的网络接口没有地址,有的只有IPV6地址),但我感觉我这方法应该不是个“正路”,希望能有有经验的人看到给我指点迷津。

以下贴出测试用的截图和代码,是我机器上的结果:

偷懒代码:

var interfaceList = NetworkInterface.GetAllNetworkInterfaces();
            StringBuilder sb = new StringBuilder(512);
            int index = 0;
            string message = string.Empty;

            foreach(var item in interfaceList)
            {
                index++;

                sb.AppendLine(string.Format("Interface{0}: {1}", index, item.Name));
                sb.AppendLine(string.Format("Description: {0}", item.Description));
                sb.AppendLine(string.Format("ID: {0}", item.Id));
                sb.AppendLine(string.Format("Type: {0}", item.NetworkInterfaceType));
                sb.AppendLine(string.Format("OperationalStatus: {0}", item.OperationalStatus));
                sb.AppendLine(string.Format("IsReceiveOnly: {0}", item.IsReceiveOnly));
                sb.AppendLine(string.Format("Speed: {0}", item.Speed));
                sb.AppendLine(string.Format("SupportMulticast: {0}", item.SupportsMulticast));
                sb.AppendLine(string.Format("SupportIPV4: {0}", item.Supports(NetworkInterfaceComponent.IPv4)));

                sb.AppendLine(string.Format("IP Properties:"));
                var addresses = item.GetIPProperties().UnicastAddresses;
                int j = 0;
                foreach (var ip in addresses)
                {
                    j++;
                    sb.AppendLine(string.Format("Address{0}: {1}({2})", j, ip.Address.ToString(),ip.Address.AddressFamily));
                    sb.AppendLine(string.Format("IPV4 Mask: {0}", ip.IPv4Mask));
                    sb.AppendLine(string.Format("PrefixOrigin: {0}", ip.PrefixOrigin));
                    sb.AppendLine(string.Format("SuffixOrigin: {0}", ip.SuffixOrigin));
                    sb.AppendLine(string.Format("DuplicateAddressDetectionState: {0}", ip.DuplicateAddressDetectionState));
                }
                sb.AppendLine();
            }

            textBox1.Text = sb.ToString();
时间: 2024-10-21 11:08:55

C#自动选择出系统中最合适的IP地址的相关文章

业务系统审核操作过后自动登出系统

问题描述:执行报告在审核通过或退回修改操作之后,自动登出系统. 排查问题:开始以为是生产服务器集群session共享问题导致的,后来排查发现,有一个图片不能正常加载,报404问题,url:http://test.gzkcw.egrant.cn/egrantweb/${res}/images/spinner.gif ,其中${res}没有正常解析. 问题处理:修正${res}不能正常解析问题即可: 原文地址:https://www.cnblogs.com/jianzhou/p/12095173.h

检测局域网中未使用的IP地址

临时检测局域网中未使用的IP地址 #!/bin/bash echo "检测局域网中未使用的IP地址2015" echo ""     processbar() {         local current=$1; local total=$2;         local maxlen=80; local barlen=66; local perclen=14;         local format="%-${barlen}s%$((maxlen-b

Ubuntu系统中连接TFS的Git地址注意事项

在Ubuntu中安装Git后,配置远程Git服务器地址,如果是TFS的Git仓库地址,则需要使用IP地址,否则可能出现识别不出来的问题; 再者,如果你想要在Ubuntu的浏览中访问TFS的Git仓库Url,通常需要我们输入Windows凭证,输入用户名密码时需要注意,我们不用输入域名,直接输入你的用户名密码就可以了. 原文地址:https://www.cnblogs.com/lishidefengchen/p/8508394.html

关于网络中的内网IP地址和公网IP地址

公网IP和内网IP    一.先来看一下IP地址划分: A类地址:0.0.0.0------127.255.255.255 其中127.255.255.255是广播地址,不能分配 B类地址:128.0.0.0------191.255.255.255 C类地址:192.0.0.0------223.255.255.255 D类地址:224.0.0.0-----239.255.255.255 E类地址:240.0.0.0------255.255.255         你要是想看你自己机子的IP

linux中匹配正确的ip地址

1.假设IP地址是规范的,没有出错误的 sed -n "/[0-9]\{1,3\}.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p" test 这种匹配存在明显的问题,在正则匹配的过程中,若是出现300,1,255,0:192.168.0.  :192.168,1.1.1这种错误的IP地址,任然会被匹配到 2.IP地址规范与否未知的情况下匹配 在这里,逛论坛的时候看见一位老哥踩了一个坑,这里做 一下记录 sed -n -r "/((([0

如何使用确定对方已经阅读你发送的邮件并从对方邮件中确定对方的ip地址

好多大学的选修课都是按照老师的要求把作业发送到邮箱中,但是好多同学发送了作业or结业论文后不知道老师是否已经接收到.可以使用以下的方式来确定老师是否已经阅读邮件. 第一步:打开邮箱找到"已发送" 第二步:双击你发送的邮件,看到最上方的选项 点击撤回,如果对方未阅读,则可以撤回,否者无法撤回.但是超过15天的则无法撤回.所述方式比较被动,下面介绍如何在发送前设置: 第一步:点击到写信的页面: 在最下方有向下的小型双箭头:点击后如下展示: 把需要回执勾选,则对方打开文件后就会显示对方需要你

MySQL中应该怎样存储IP地址

为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得知怎样存,直接varchar类型不久得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升. 利用函数算法处理 在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少看空间.因为varchar是可变长

如何在 Linux 中找到你的 公网IP 地址

每个网站都有一个独有的公开 IP 地址,可供任何人从任何地方访问. 互联网协议Internet Protocol(IP)不需要介绍 -- 我们每天都在使用它.即使你不直接使用它,当你在浏览器上输入 website-name.com 时,它会查找该 URL 的 IP 地址,然后加载该网站. 我们将 IP 地址分为两类:私有和公共.私有 IP 地址是你的无线路由(和公司内网)提供的私有 IP 地址.它们的范围是 10.xxx.172.16.xx-172.31.xx 和 192.168.xx,其中 x

python中利用正则表达式匹配ip地址

现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手? 首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢? \d或[0-9] 对于这个问题,不要一下子上来就写匹配模式,应该一步步分解,把复杂的问题简单化 比如ip地址,我们可以总结一下规律 1. 它是一个字符串 2. 字符串内部是由4个1-3位的数字和3个.组成 3. 数字的范围是0-255 接下来,我们先试一下匹配第1个数字 第一步:尝试匹配192.168.100.123中的192 >>> import