получить локальный IPv4 компьютера с помощью VB.net

StackOverflow https://stackoverflow.com/questions/1642256

  •  10-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить IP-адрес моего локального компьютера, и один из других моих компьютеров отлично получает адрес v4, но на этом код:

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

возвращает, как мне кажется, адрес IPv6:

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

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

Это было полезно?

Решение

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

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

Изменить - не заметил, что вы спрашиваете в 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()

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

Другие советы

Вот мое решение для получения маршрутизируемого 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). Вы можете удалить или изменить эту часть, если вы ищете что-то еще.

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

 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 .

Возможно, что-то забавное - эта маленькая функция, которая покажет все 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

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

Сначала вам необходимо импортировать пространство имен системы в ваше приложение, а затем создать экземпляр 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
 Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
 txtLocal.Text = localIp.AddressList(1).ToString

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top