Estoy haciendo un programa para WIFI pero tengo un problemita. A la hora de mostrar la IP del equipo me sale en un formato raro.
Mi IP es: 192.168.1.2
pero me muestra lo siguiente:
Esta sería la IP: :huh: fe80::3ddd:f4d5:69b7:ddd8%12
Este es el código que empleo (VB.NET 2010)
Dim Host As String
Host = Dns.GetHostName
Dim IPs As IPHostEntry = Dns.GetHostEntry(Host)
Dim Direcciones As IPAddress() = IPs.AddressList
MiIP.Text = Direcciones(0).ToString()
Lo he revisado y comparado con otros códigos pero nada. ¿Qué puede ser?
Gracias.
Cita de: Lucas.AR en 28 Noviembre 2012, 05:46 AM
A la hora de mostrar la IP del equipo me sale en un formato raro.
Mi IP es: 192.168.1.2
pero me muestra lo siguiente:
Esta sería la IP: :huh: fe80::3ddd:f4d5:69b7:ddd8%12
Es la IP en formato IPv6 asociada a tu máquina. Seguramente tu dirección local IPv4 estára en la posición Direcciones(1) ya que es un Array de Direcciones IPs pertenecientes a tu máquina.
Saludos!
si, aparte te muestra siempre la primera, fijate abria la consola y hace un ipconfig /all, ahi te deben aparecerlas direcciones de los adaptadores que tengas, para que te muestre la verdadera ip local debes recorrer los adaptadores y de ahi filtrar los que son de tipo local o algo asi, no me acuerdo pero en internet si buscas lo encontras.
saludos.
Hay que filtrar el AddressList para hallar la IPv4 pública ;)
Aquí te dejo el código:
Public Function GetPublicIP() As IPAddress
GetPublicIP = Nothing
Dim LocalHost As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
For Each Address In LocalHost.AddressList
'Si no es IPv6'
If Not (Address.IsIPv6SiteLocal Or Address.IsIPv6Multicast Or Address.IsIPv6LinkLocal) Then
'Si es de la familia InterNetwork'
If Address.AddressFamily = Sockets.AddressFamily.InterNetwork Then
'Y no es privada'
If Not IsPrivateIP(Address) Then
Return Address
End If
End If
End If
Next
End Function
Public Function IsPrivateIP(ByVal IP As IPAddress) As Boolean
Dim _0, _1 As Byte
'Si el primer byte es 10 es privada'
'Si el primer byte es 172 y el segundo está entre 16-31 es privada'
'Si el segundo byte es 168 es privada'
'De lo contrario es pública'
_0 = IP.GetAddressBytes(0)
_1 = IP.GetAddressBytes(1)
Select Case _0
Case 10
Return True
Case 172
If _1 >= 16 And _1 <= 31 Then Return True
Case 192
If _1 = 168 Then Return True
End Select
Return False
End Function
Tienen razón, no me di cuenta de eso. Se trata de la IPv6.
A medida que voy aumentando de a uno los valores me van saliendo distintos resultados y comparando con lo que me sale en la consola sería así (no se si cambia en todos las computadoras):
CitarAdaptador de LAN inalámbrica Conexión de red inalámbrica:
(3) Dirección IPv6 . . . . . . . . . . : 2002:c7c8:c8bb:c:3ddd:f4d5:69b7:ddd8
(1 )Sitio: dirección IPv6 local. . . . : fec0::c:3ddd:f4d5:69b7:ddd8%2
(4) Dirección IPv6 temporal. . . . . . : 2002:c7c8:c8bb:c:e00f:c51c:971d:fa56
(0) Vínculo: dirección IPv6 local. . . : fe80::3ddd:f4d5:69b7:ddd8%12
(5) Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.2
Adaptador de túnel Teredo Tunneling Pseudo-Interface:
(6)Dirección IPv6 . . . . . . . . . . : 2001:0:9d38:6ab8:101d:395a:3f57:fefd
(2) Vínculo: dirección IPv6 local. . . : fe80::101d:395a:3f57:fefd%13
Como verán, si quisiera mostrar sin problemas la "Dirección IPv4" debo utilizar la posición
(5):
MiIP.Text = Direcciones(5).ToString()
Muchas gracias. ;)
si, pero no siempre va a ser la 5, por eso debes usar ese codigo que recorre cada uno de los adaptadores de red que tengas y filtrar cuando llega a una direccion de tipo IPv4, entonces esa es la direccion que tenes que sacar.
Sí, me fijé con otra notebook y me salió cualquier cosa. :rolleyes:
Estaba revisando el código de Keyen Night y no me funcionó pero me llamó la atención esta parte que tampoco me había dado cuenta:
Address.AddressFamily = Sockets.AddressFamily.InterNetwork
... y entonces, me puse a probar y pude solucionar mi intringulis:
Dim Host As IPHostEntry
Dim IPLocal As String = vbNullString
Host = Dns.GetHostEntry(Dns.GetHostName())
For Each ip As IPAddress In Host.AddressList
If ip.AddressFamily = Sockets.AddressFamily.InterNetwork Then
'If ip.AddressFamily.ToString() = "InterNetwork" Then 'Tambien lo puedo hacer así jejeje
IPLocal = ip.ToString
End If
Next
Donde también puedo poner .InterNetworkV6 y veo la IPv6 :P
Muchas gracias a todos de nuevo. Puedo suspirar tranquilo ahora, jaja. :xD
Un abrazo.