obtener IPv4 local de la computadora usando VB.net
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?
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)
.