【问题标题】:.Net IPAddress IPv4.Net IP 地址 IPv4
【发布时间】:2011-01-04 02:58:01
【问题描述】:

我有以下代码:

Dim ipAdd As IPAddress = Dns.GetHostEntry(strHostname).AddressList(0)
Dim strIP As String = ipAdd.ToString()

当我转换为字符串而不是 IPv4 地址(如 192.168.1.0 或类似地址)时,我得到 IPv6 版本:fd80::5dbe:5d89:e51b:d313 地址。

有没有办法可以从 IPAddress 类型返回 IPv4 地址?

谢谢

【问题讨论】:

    标签: c# .net vb.net ip-address


    【解决方案1】:

    dtb 的解决方案适用于许多情况。然而,在许多情况下,用户可能在他们的系统上设置了多个 v4 IP。有时这是因为他们有一些“虚拟”适配器(来自 VirtualBox 或 VMWare 等应用程序),或者因为他们有多个物理网络适配器连接到他们的计算机。

    不用说,在这些情况下,使用正确的 IP 很重要。您可能需要考虑询问用户哪个 IP 合适。

    要获取可用的 v4 IP 列表,您可以使用类似以下的代码:

    '获取一个包含所有可用 IP 的数组: Dim IPList() As IPAddress = Net.Dns.GetHostEntry(Net.Dns.GetHostName.ToString).AddressList

    'Copy valid IPs from IPList to FinalIPList
    Dim FinalIPList As New ArrayList(IPList.Length)
    For Each IP As IPAddress In IPList
        'We want to keep IPs only if they are IPv4 and not a 'LoopBack' device
        '(an InterNetwork AddressFamily indicates a v4 IP)
        If ((Not IPAddress.IsLoopback(IP)) And (IP.AddressFamily = AddressFamily.InterNetwork)) Then
            FinalIPList.Add(IP)
        End If
    Next IP
    

    【讨论】:

      【解决方案2】:

      对我来说,带有“First”谓词的解决方案不能正常工作,这是适合我的代码:

      public static string GetLocalIP() 
              {
                  string ipv4Address = String.Empty;
      
                  foreach (IPAddress currrentIPAddress in Dns.GetHostAddresses(Dns.GetHostName()))
                  {
                      if (currrentIPAddress.AddressFamily.ToString() == System.Net.Sockets.AddressFamily.InterNetwork.ToString())
                      {
                          ipv4Address = currrentIPAddress.ToString();
                          break;
                      }
                  }
      
                  return ipv4Address;
              }
      

      【讨论】:

        【解决方案3】:

        您可以使用第一个 IPv4 地址,而不是无条件地获取 AddressList 的第一个元素:

        var address = Dns.GetHostEntry(strHostname)
                         .AddressList
                         .First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
        

        【讨论】:

        • 这是 VB 版本:Dim ipAdd As IPAddress = Dns.GetHostEntry("aol.com").AddressList.First(Function(f) f.AddressFamily = Sockets.AddressFamily.InterNetwork)
        猜你喜欢
        • 2011-06-09
        • 2013-07-02
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 2014-03-03
        相关资源
        最近更新 更多