• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#如何自动选择出系统中最合适的IP地址

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

作者:Cinlap Soft 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Cinlap Soft 通过本文主要向大家介绍了马桶c的个人空间,c语言,欲情 c max,维生素c,奔驰c200等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

起因:凡是网络程序,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();
</div>

以上就是本文的全部内容,希望对大家的学习有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#利用ReportViewer生成报表
  • C#基于正则去掉注释的方法示例
  • C#中new的用法及与override的区别分析
  • C#实现两个richtextbox控件滚动条同步滚动的简单方法
  • C# for循环的经典案例集锦
  • C#操作word的方法示例
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法
  • C# WinForm制作异形窗体与控件的方法
  • C#实现Excel表数据导入Sql Server数据库中的方法
  • C#使用NPOI上传excel

相关文章

  • 2017-05-28C#判断指定驱动器是否是Fat分区格式的方法
  • 2017-05-28使用C#实现在屏幕上画图效果的代码实例
  • 2017-05-28C# Redis学习系列(二)Redis基本设置
  • 2017-05-28C#中的两种debug方法介绍
  • 2017-05-28C#华氏温度和摄氏温度相互转换的方法
  • 2017-05-28C#实现ComboBox控件显示出多个数据源属性的方法
  • 2017-05-28C#实现图片上传(PC端和APP)保存及 跨域上传说明
  • 2017-05-28提权函数之RtlAdjustPrivilege()使用说明
  • 2017-05-28c#日期间隔计算示例
  • 2017-05-28C#读取二进制文件方法分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#中ZipHelper 压缩和解压帮助类
    • Log4Net 日志配置[附带源码下载]
    • C#中如何在Excel工作表创建混合型图表实例
    • C#实现将商品金额小写转换成大写的方法
    • C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)
    • c#后台输出javascript语句示例程序
    • C#中面向对象编程机制之继承学习笔记
    • C#正则检测字符串是否字母数字混编的方法
    • C#中的委托介绍
    • C#泛型用法实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有