obter IPv4 local do computador usando VB.net
Pergunta
Eu estou tentando obter o endereço ip do meu PC local, e um um dos meus outros PCs torna-se o endereço fina v4, mas em um presente do código:
Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()
retorna o que eu acho que é um endereço IPv6:
fe80::9c09:e2e:4736:4c62%11
Como faço para obter o endereço IPv4?
Solução
Aviso - Eu não tenho IPv6 instalado e provavelmente há uma maneira muito melhor de fazer isso, mas o que faz o seguinte retorno:
Dns.GetHostEntry(Dns.GetHostName()).AddressList
.Where(a => !a.IsIPv6LinkLocal && !a.IsIPv6Multicast && !a.IsIPv6SiteLocal)
.First()
.ToString();
Editar - não percebi que você estava pedindo em VB, então eu tentei traduzi-la para:
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()
Isto pode explodir, por isso não tratá-lo como código de produção.
Outras dicas
Aqui está a minha solução para a obtenção de um IP IPv4 roteáveis ??sem usar um serviço 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
Note que o meu código também está verificando que o intervalo é roteáveis ??(IsPrivateIP). Você pode remover ou modificar essa parte se você está procurando algo mais.
Eu acho que você deve usar o seguinte:
Dim tmpHostName As String = System.Net.Dns.GetHostName()
myIPaddress = System.Net.Dns.GetHostByName(tmpHostName).AddressList(0).ToString()
GetHostByName
é obsoleto, mas este é o caminho para obter o IPv4. Por quê? Porque a função getbyhostname
é criado antes IPv6 assim a função de obter apenas a conexão IPv4, não o fe80::9c09:e2e:4736:4c62%11
.
Algo talvez diversão é esta pequena função que vai mostrar todos os endereços IP em seu computador:
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
Eu estava procurando a resposta para essa pergunta a mim mesmo e eu não poderia encontrar um adequado às minhas necessidades. Eu consegui experimentar várias respostas através da rede até que eu vim com essa (funciona muito bem!). Só pensei que eu iria partilhar uma vez que este post é o primeiro resultado através do 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
Você primeiro precisa importar o namespace sistema em sua aplicação e, em seguida, criar uma instância do System.Net.NetworkInformation.IPAddressInformation
e usá-lo como tal
Exemplo
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 eu mudei o índice (0)
para (1)
.