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

 更新时间:2015年08月03日 10:04:39   作者:Cinlap Soft  
这篇文章介绍了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();

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

相关文章

  • C# winfrom 模拟ftp文件管理实现代码

    C# winfrom 模拟ftp文件管理实现代码

    从网上找到的非常好用的模拟ftp管理代码,整理了一下,希望对需要的人有帮助
    2014-01-01
  • C#递归算法之打靶算法分析

    C#递归算法之打靶算法分析

    这篇文章是对打靶算法分析,比较简单,但逻辑一定要清楚,分析问题的方法一定要准确,有需要的朋友可以参考一下。
    2016-06-06
  • C#实现获取电脑硬件显卡信息的示例代码

    C#实现获取电脑硬件显卡信息的示例代码

    这篇文章主要为大家详细介绍了如何使用C#实现获取电脑硬件显卡信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • WPF基础教程之形状画刷与变换详解

    WPF基础教程之形状画刷与变换详解

    这篇文章主要给大家介绍了关于WPF基础教程之形状画刷与变换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 基于WPF简单实现Meesage消息提醒

    基于WPF简单实现Meesage消息提醒

    这篇文章主要介绍了如何利用WPF简单实现Meesage消息提醒,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2023-07-07
  • C#基于JsonConvert解析Json数据的方法实例

    C#基于JsonConvert解析Json数据的方法实例

    最近初接触C#语言,发现JSON解析这块和JAVA差异过大,下面这篇文章主要给大家介绍了关于C#基于JsonConvert解析Json数据的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 使用C#写了一个可以推算火车票身份证号码的小程序

    使用C#写了一个可以推算火车票身份证号码的小程序

    这篇文章主要介绍了使用C#写了一个可以推算火车票身份证号码的小程序 的相关资料,需要的朋友可以参考下
    2016-02-02
  • C#中单例的实现方法

    C#中单例的实现方法

    这篇文章主要介绍了C#中单例的实现方法,以实例形式分析了C#中单例的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C#中深度复制和浅度复制详解

    C#中深度复制和浅度复制详解

    这篇文章主要介绍了C#中深度复制和浅度复制的相关资料,需要的朋友可以参考下
    2015-10-10
  • C#日期格式字符串的相互转换操作实例分析

    C#日期格式字符串的相互转换操作实例分析

    这篇文章主要介绍了C#日期格式字符串的相互转换操作,结合实例形式分析了C#日期格式字符串的相互转换操作函数与相关使用技巧,需要的朋友可以参考下
    2019-08-08

最新评论