2010-01-12 119 views
7

我有以下代码:净ip地址的IPv4

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地址?

感谢

回答

15

而不是无条件地采取AddressList中的第一个元素,你可以采取的第一个IPv4地址:

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

这里的VB版本的: Dim ipAdd As IPAddress = Dns.GetHostEntry(“aol.com”).AddressFirst = – 2010-01-12 14:12:38

2

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

毫无疑问,在这些情况下,使用正确的IP非常重要。你可能想要考虑询问用户哪个IP是合适的。

为了让你可以使用类似于代码可用V4的IP地址列表:

“获取它包含了所有可用IP的数组:)作为ip地址= Net.Dns.GetHostEntry 昏暗IPLIST((净。 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 
0

对我来说,与“第一”谓词的解决方案没有正常工作,这是对我的作品的代码:

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; 
     }