Pregunta

Estoy tratando de obtener la dirección IP de mi PC local, y una de mis otras PC obtiene la dirección v4 bien, pero en este caso el código:

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 obtengo la dirección IPv4?

¿Fue útil?

Solución

Descargo de responsabilidad : no tengo instalado IPv6 y probablemente haya una forma mucho mejor de hacerlo, pero ¿qué devuelve lo siguiente?

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

Editar - no me di cuenta de que estabas preguntando en VB, así que intenté 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 explotar, así que no lo trate como código de producción.

Otros consejos

Aquí está mi solución para obtener una IP enrutable IPv4 sin usar 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 mi código también está verificando que el rango sea enrutable (IsPrivateIP). Puede eliminar o modificar esa parte si está buscando otra cosa.

Creo que deberías usar esto:

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

GetHostByName está obsoleto, pero esta es la forma de obtener el IPv4. ¿Por qué? Debido a que la función getbyhostname se crea antes de IPv6, la función solo obtiene la conexión IPv4, no el fe80 :: 9c09: e2e: 4736: 4c62% 11 .

Algo divertido es esta pequeña función que mostrará todas las direcciones IP en su computadora:

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

Estaba buscando la respuesta a esta pregunta y no pude encontrar una adecuada para mis necesidades. Logré experimentar con varias respuestas en la red hasta que se me ocurrió esto (¡funciona muy bien!). Solo pensé en compartirlo, ya que esta publicación es el principal resultado 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

Primero debe importar el espacio de nombres del sistema en su aplicación y luego crear una instancia de System.Net.NetworkInformation.IPAddressInformation y úsalo 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
 Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
 txtLocal.Text = localIp.AddressList(1).ToString

Observe que cambié el índice (0) a (1) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top