2009-10-29 9 views
6

J'essaie d'obtenir l'adresse IP de mon PC local, et l'un de mes autres PC, il obtient l'amende d'adresse v4, mais celui-ci le code:obtenir IPv4 de l'ordinateur local en utilisant VB.net

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

retourne ce que je suppose est une adresse IPv6:

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

Comment puis-je obtenir l'adresse IPv4?

Répondre

9

Avertissement - Je n'ai pas IPv6 installé et il y a probablement une bien meilleure façon de le faire, mais qu'est-ce que le retour suivant:

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

Edit - ne pas remarqué que vous demandiez en VB, donc je l'ai essayé de traduire à:

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 peut exploser, donc ne pas traiter comme code de production.

+0

D'où vient le a? –

+0

Jonathan- Je n'ai pas vu les tags VB, donc posté ma réponse en C#. Je l'ai maintenant (espérons-le) traduit en VB.NET. – RichardOD

+0

merci, je pensais que ce n'est pas VB :) –

1

Voici ma solution pour obtenir un IP routable IPv4 sans utiliser un 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.

0

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 c'est le moyen d'obtenir l'IPv4. Pourquoi? Parce que la fonction getbyhostname est créée avant IPv6, la fonction obtient uniquement la connexion IPv4, pas le fe80::9c09:e2e:4736:4c62%11.

0

quelque chose d'amusant est peut-être cette petite fonction qui va montrer toutes les adresses IP sur 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 
0

Je cherchais la réponse à cette question moi-même et je ne pouvais pas trouver un adapté à mes besoins. J'ai réussi à expérimenter avec diverses réponses à travers le net jusqu'à ce que je suis venu avec cela (fonctionne très bien!). Je pensais que je partagerais puisque ce poste est le meilleur résultat 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 
0

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

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 
+0

Cela ne fonctionne pas. –

0
Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName()) 
txtLocal.Text = localIp.AddressList(1).ToString 

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