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

#vb.net #ipv4

#vb.net #ipv4

Вопрос:

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

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

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

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

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

Ответ №1:

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

 Dns.GetHostEntry(Dns.GetHostName()).AddressList
    .Where(a => !a.IsIPv6LinkLocal amp;amp; !a.IsIPv6Multicast amp;amp; !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()
  

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

Комментарии:

1. Джонатан — Я не видел тегов VB, поэтому опубликовал свой ответ на C #. Теперь я (надеюсь) перевел его на VB.NET .

2. @RichardOD Насколько стабилен этот код? Кстати, спасибо, что указали на это, сэр.

3. Это VB, использующий Linq

Ответ №2:

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

Ответ №3:

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

  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 .

Ответ №4:

Возможно, есть что-то забавное в этой маленькой функции, которая покажет все 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 amp; vbCrLf
            position  = 1
        End While`enter code here`
        Return ip
    End Function
  

Ответ №5:

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

Ответ №6:

Сначала вам нужно импортировать пространство имен system в ваше приложение, а затем создать экземпляр 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 " amp; IPAdd.Address.ToString)
    End Sub
End Class
  

Ответ №7:

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

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

Ответ №8:

Я использовал комбинированный код Cmd / Visual Basic, и это сработало :

     Dim ResString As String = "result.txt"

    If File.Exists("result.txt") Then
        File.Delete("result.txt")
    End If

    Shell("cmd.exe /c  cd " amp; Application.StartupPath amp; " amp;amp; ipconfig >> " amp; ResString amp; "amp;amp; exit", AppWinStyle.NormalFocus)

    Dim Ipv4 As String
    Dim Ipv4Found As Boolean = False
    Dim Ipv4Char As Integer = 43
    Dim Ipv4Str As String
    Threading.Thread.Sleep(1500)
    'Wait some seconds to create "result.txt"

    Dim Ipv4Reader As StreamReader
    Ipv4Reader = File.OpenText("result.txt")

    Do Until Ipv4Found = True

        Ipv4Str = Ipv4Reader.ReadLine()
        If Not Ipv4Str = Nothing Then
            If Ipv4Str.Contains("IPv4") Then
                Try
                    Ipv4 = Ipv4Str.Chars(Ipv4Char)
                    Do Until Ipv4Char = 60
                        Ipv4Char = Ipv4Char   1
                        Ipv4 = Ipv4 amp; Ipv4Str.Chars(Ipv4Char)
                        'Read results step by step
                    Loop
                Catch ex As Exception
                End Try
                MsgBox("Your IPv4 Address is " amp; Ipv4)
                Ipv4Found = True
                Ipv4Reader.Close()

            End If
        Else

        End If
    Loop
  

Если язык вашего компьютера английский, у вас могут быть некоторые необычные символы в строке IPv4 (мой компьютер на самом деле на итальянском языке)

Ответ №9:

Это работает на моей стороне

 Dim IPaddressList = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList
        Dim IPaddrPC As String = ""
        For Each item In IPaddressList
            If item.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then
                IPaddrPC = item.Address.ToString
                Exit For
            End If
        Next