2009-10-29 2 views
6

Я пытаюсь получить IP-адрес моего локального ПК, и один один из моих других ПК он получает v4 адрес штраф, но на этот код:получить локальный IPv4 компьютера с помощью VB.net

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

возвращает то, что я предполагаю, что это адрес IPv6:

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

Как получить адрес IPv4?

ответ

9

Отказ - Я не устанавливал IPv6 и, вероятно, существует гораздо лучший способ сделать это, но то, что делает следующее возвращение:

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

Edit - не заметил, что вы просили в VB, так что я пытался переводить его:

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

Это может взорвать, так что не рассматривать его как производственный код.

+0

Откуда он? –

+0

Джонатан. Я не видел теги VB, поэтому отправил свой ответ на C#. Я теперь (надеюсь) перевел его на VB.NET. – RichardOD

+0

спасибо, я думал, что это не VB :) –

1

Вот мое решение для получения маршрутизируемого IPv4 IP без использования внешней службы:

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 

Обратите внимание, что мой код также проверить, что диапазон маршрутизируемым (IsPrivateIP). Вы можете удалить или изменить эту часть, если ищете что-то еще.

0

Я думаю, вы должны использовать это:

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

GetHostByName является устаревшим, но это способ получить IPv4. Зачем? Потому что функция getbyhostname создана до IPv6, поэтому функция получает только соединение IPv4, а не fe80::9c09:e2e:4736:4c62%11.

0

Что-то может быть весело эта маленькая функция, которая будет показывать все IP-адрес на компьютере:

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

Я искал ответ на этот вопрос сам, и я не мог найти подходящую для моих потребностей. Мне удалось экспериментировать с различными ответами по сети, пока я не придумал это (отлично работает!). Просто подумал, что я поделюсь, поскольку этот пост является лучшим результатом через 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

Сначала необходимо импортировать системы имен в приложение, а затем создать экземпляр System.Net.NetworkInformation.IPAddressInformation и использовать его в качестве такого

Пример

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

Это не работает. –

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

Обратите внимание, что я изменил индекс (0) на (1).

Смежные вопросы