2009-10-29 18 views
6

Próbuję uzyskać adres IP mojego lokalnego komputera, a jeden z moich innych komputerów dostaje adres v4 dobrze, ale na tym jeden kod:uzyskać lokalny IPv4 komputera za pomocą VB.net

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

powraca co myślę, że jest to adres IPv6:

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

Jak uzyskać adres IPv4?

Odpowiedz

9

Zastrzeżone - Nie zainstalowano IPv6 i jest prawdopodobnie znacznie lepszym sposobem, aby to zrobić, ale to, co robi następujący zwrot:

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

Edit - nie zauważył pan pyta w języku VB, więc próbowałem przetłumaczyć go na:

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

Może to wysadzić się, więc nie traktuj tego jako kod produkcyjny.

+0

skąd pochodzi? –

+0

Jonathan- Nie widziałem tagów VB, więc wysłałem moją odpowiedź w języku C#. Mam (mam nadzieję) przetłumaczyć go na VB.NET. – RichardOD

+0

dziękuję, myślałem, że to nie VB :) –

1

Oto moje rozwiązanie dla coraz routing IPv4 IP bez korzystania z usług zewnętrznych:

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 

Zauważ, że mój kod jest również sprawdzenie, czy zakres jest routingu (IsPrivateIP). Możesz usunąć lub zmodyfikować tę część, jeśli szukasz czegoś innego.

0

myślę, że należy to wykorzystać:

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

GetHostByName jest przestarzały, ale jest to sposób, aby uzyskać IPv4. Czemu? Ponieważ funkcja getbyhostname jest tworzona przed IPv6, więc funkcja pobiera tylko połączenie IPv4, a nie fe80::9c09:e2e:4736:4c62%11.

0

Coś może jest to trochę zabawa funkcja, która pokaże wszystkie adresy IP na komputerze:

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

szukałem odpowiedzi na to pytanie, a ja nie mogłem znaleźć odpowiedni do moich potrzeb. Udało mi się eksperymentować z różnymi odpowiedziami w sieci, dopóki nie wymyśliłem tego (działa świetnie!). Pomyślałem, że udostępnię, ponieważ ten wpis jest najlepszym wynikiem za pośrednictwem 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

Najpierw należy zaimportować przestrzeń nazw systemu do aplikacji, a następnie utworzyć instancję System.Net.NetworkInformation.IPAddressInformation i używać go jako takiego

Przykład

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

To nie działa. –

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

Zauważ, że zmieniłem indeks (0) na (1).

Powiązane problemy