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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top