Question

J'essaie d'obtenir l'adresse IP de mon PC local et l'un de mes autres PC obtient une adresse v4 correcte, mais sur celui-ci le code:

Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()

renvoie ce que je suppose est une adresse IPv6:

fe80::9c09:e2e:4736:4c62%11

Comment obtenir l'adresse IPv4?

Était-ce utile?

La solution

Clause de non-responsabilité : je n'ai pas installé IPv6 et il existe probablement une bien meilleure façon de le faire, mais que renvoie le retour suivant:

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

Modifier - vous n'avez pas remarqué que vous posiez la question en VB, j'ai donc essayé de le traduire en:

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

Cela pourrait exploser, ne le considérez donc pas comme un code de production.

Autres conseils

Voici ma solution pour obtenir une adresse IP IPv4 routable sans utiliser de service externe:

  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

Notez que mon code vérifie également que la plage est routable (IsPrivateIP). Vous pouvez supprimer ou modifier cette partie si vous recherchez autre chose.

Je pense que vous devriez utiliser ceci:

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

GetHostByName est obsolète, mais vous obtiendrez ainsi le protocole IPv4. Pourquoi? La fonction getbyhostname étant créée avant IPv6, elle n'obtient que la connexion IPv4, et non le fe80 :: 9c09: e2e: 4736: 4c62% 11 .

Quelque chose d’amusant est cette petite fonction qui affiche toutes les adresses IP de votre ordinateur:

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

Je recherchais moi-même la réponse à cette question et je ne trouvais pas celle qui convienne à mes besoins. J'ai réussi à expérimenter différentes réponses sur le net jusqu'à ce que je trouve ça (ça marche super!). Je pensais que je partagerais cet article, car il s'agit du meilleur résultat obtenu via 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

Vous devez d'abord importer l'espace de noms système dans votre application, puis créer une instance de System.Net.NetworkInformation.IPAddressInformation et l'utiliser comme tel

Exemple

  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

Notez que j'ai changé l'index (0) en (1) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top