2009-10-29 30 views
6

Estoy tratando de obtener la dirección IP de mi PC local, y uno a uno de mis otros PC se pone la dirección v4 bien, pero en este caso el código:obtener IPv4 local del ordenador utilizando VB.net

Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString() 

devuelve lo que supongo que es una dirección IPv6:

fe80::9c09:e2e:4736:4c62%11 

¿Cómo consigo la dirección IPv4?

Respuesta

9

Negación - No lo he instalado IPv6 y es probable que haya una mejor manera de hacer esto, pero lo que hace lo siguiente retorno:

Dns.GetHostEntry(Dns.GetHostName()).AddressList 
    .Where(a => !a.IsIPv6LinkLocal && !a.IsIPv6Multicast && !a.IsIPv6SiteLocal) 
    .First() 
    .ToString(); 

Editar - no se dio cuenta que preguntabas en VB, por lo que he intentado traducirlo a:

Dim s As String = Dns.GetHostEntry(Dns.GetHostName()).AddressList _ 
    .Where(Function(a As IPAddress) Not a.IsIPv6LinkLocal AndAlso Not a.IsIPv6Multicast AndAlso Not a.IsIPv6SiteLocal) _ 
    .First() _ 
    .ToString() 

Esto puede estallar, así que no lo tratan como código de producción.

+0

¿de dónde viene el a? –

+0

Jonathan- No vi las etiquetas VB, así que publiqué mi respuesta en C#. Ahora (con suerte) lo he traducido a VB.NET. – RichardOD

+0

gracias, estaba pensando que no es VB :) –

1

aquí está mi solución para obtener una dirección IP IPv4 enrutables sin necesidad de utilizar un servicio externo:

Function GetLocalIP() As String 
    Dim IPList As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName) 

    For Each IPaddress In IPList.AddressList 
     'Only return IPv4 routable IPs 
     If (IPaddress.AddressFamily = Sockets.AddressFamily.InterNetwork) AndAlso (Not IsPrivateIP(IPaddress.ToString)) Then 
     Return IPaddress.ToString 
     End If 
    Next 
    Return "" 
    End Function 

    Function IsPrivateIP(ByVal CheckIP As String) As Boolean 
    Dim Quad1, Quad2 As Integer 

    Quad1 = CInt(CheckIP.Substring(0, CheckIP.IndexOf("."))) 
    Quad2 = CInt(CheckIP.Substring(CheckIP.IndexOf(".") + 1).Substring(0, CheckIP.IndexOf("."))) 
    Select Case Quad1 
     Case 10 
     Return True 
     Case 172 
     If Quad2 >= 16 And Quad2 <= 31 Then Return True 
     Case 192 
     If Quad2 = 168 Then Return True 
    End Select 
    Return False 
    End Function 

Tenga en cuenta que el código también está verificando que el rango se puede enrutar (IsPrivateIP). Puede eliminar o modificar esa parte si está buscando algo más.

0

creo que puedes usar esto:

Dim tmpHostName As String = System.Net.Dns.GetHostName() 
myIPaddress = System.Net.Dns.GetHostByName(tmpHostName).AddressList(0).ToString() 

GetHostByName es obsoleta pero esta es la manera de conseguir el IPv4. ¿Por qué? Porque la función getbyhostname se crea antes de IPv6, por lo que la función solo obtiene la conexión IPv4, no el fe80::9c09:e2e:4736:4c62%11.

0

Algo tal vez divertido es esta pequeña función que va a mostrar todas las direcciones IP de su ordenador:

Public Function getOwnIp() As String 
     Dim hostIP As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName()) 
     Dim position As Integer = 0 
     Dim ip As String = Nothing 
     While ipList < hostIP.AddressList.Length 
      ip += hostIP.AddressList(position).ToString & vbCrLf 
      position += 1 
     End While`enter code here` 
     Return ip 
    End Function 
0

que estaba buscando la respuesta a esta pregunta a mí mismo y no pude encontrar uno adecuado para mis necesidades. Logré experimentar con varias respuestas en la red hasta que se me ocurrió esto (¡funciona muy bien!). Solo pensé en compartir, ya que esta publicación es el resultado principal a través de Google.

''''Routine to fetch IPv4 Network addresses for all local network interfaces. 
    Dim adapters As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces() 
    Dim adapter As NetworkInterface 
     For Each adapter In adapters 
      Dim properties As IPInterfaceProperties = adapter.GetIPProperties() 
      If properties.UnicastAddresses.Count > 0 Then 
       For Each unicastadress As UnicastIPAddressInformation In properties.UnicastAddresses 
        Dim ip As IPAddress = unicastadress.Address 
        If ip.AddressFamily = AddressFamily.InterNetwork Then 
         ComboBox1.Items.Add(ip.ToString) 
        End If 
       Next unicastadress 
      End If 
     Next adapter 
0

Primero tiene que importar el espacio de nombres del sistema en la aplicación y luego crear una instancia de la System.Net.NetworkInformation.IPAddressInformation y utilizarlo como tal

Ejemplo

Imports system.data.sqlclient 
    imports system 

Public class Form1 
    Dim IPAdd As System.Net.NetworkInformation.IPAddressInformation 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

MsgBox("My IP Address is " & IPAdd.Address.ToString) 
    End Sub 
End Class 
+0

Esto no funciona. –

0
Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName()) 
txtLocal.Text = localIp.AddressList(1).ToString 

Tenga en cuenta que cambié el índice (0) a (1).

Cuestiones relacionadas