2010-01-12 27 views
7

tengo el siguiente código:.Net Dirección IP IPv4

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

al convertir a cadena en lugar de una dirección IPv4 como 192.168.1.0 o similar, tengo la versión IPv6: FD80 :: 5dbe: 5d89: e51b : dirección d313.

¿Hay alguna manera de devolver la dirección IPv4 del tipo de dirección IP?

Gracias

Respuesta

15

En lugar de tomar incondicionalmente el primer elemento de la AddressList, se puede tomar la primera dirección IPv4: solución

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

Aquí está la versión VB de eso: Dim ipAdd As IPAddress = Dns.GetHostEntry ("aol.com"). AddressList.First (Función (f) f.AddressFamily = Sockets.AddressFamily.InterNetwork) –

2

de DTB trabajará en muchas situaciones. Sin embargo, en muchos casos, los usuarios pueden tener varias IP v4 configuradas en su sistema. A veces esto se debe a que tienen algunos adaptadores "virtuales" (de aplicaciones como VirtualBox o VMWare) o porque tienen más de un adaptador de red físico conectado a su computadora.

Huelga decir que en estas situaciones es importante que se utilice la IP correcta. Es posible que desee considerar preguntarle al usuario qué IP es apropiada.

Para obtener una lista de direcciones IP v4 utilizables se pueden utilizar código similar a:

'Obtener una matriz que contiene todas las direcciones IP disponibles: Dim IPList() Como DirecciónIP = Net.Dns.GetHostEntry (neto. 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

para mí la solución con el "primero" predicado no funcionaba correctamente, este es el código que funciona para mí:

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