Frage

Ich versuche, die IP-Adresse meines lokalen PC zu bekommen, und man eine meiner anderen PCs es wird die v4-Adresse in Ordnung, aber auf diesen einen der Code:

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

gibt, was ich denke, ist eine IPv6-Adresse:

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

Wie erhalte ich die IPv4-Adresse?

War es hilfreich?

Lösung

Hinweis - Ich habe keine IPv6 installiert und es ist wahrscheinlich eine viel bessere Möglichkeit, dies zu tun, aber was tut die folgende Rückkehr:

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

Bearbeiten - gar nicht bemerkt man in VB fragten, also habe ich versucht, es zu übersetzen:

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

Diese sprengen kann, so behandeln sie nicht als Produktionscode.

Andere Tipps

Hier ist meine Lösung für einen routbare IPv4-IP bekommt einen externen Service ohne Verwendung:

  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

Beachten Sie, dass mein Code wird auch überprüfen, ob der Bereich routable (IsPrivateIP). Sie können diesen Teil entfernen oder ändern, wenn Sie etwas anderes suchen.

Ich denke, man sollte diese verwenden:

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

GetHostByName ist veraltet, aber das ist der Weg, um die IPv4 zu erhalten. Warum? Da die getbyhostname Funktion vor IPv6 erstellt wird, so dass die Funktion nur die IPv4-Verbindung bekommen, nicht der fe80::9c09:e2e:4736:4c62%11.

Etwas vielleicht Spaß ist diese kleine Funktion, die alle IP-Adressen auf Ihrem Computer zeigen werden:

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

Ich war auf der Suche nach der Antwort auf diese Frage mich und ich konnte nicht einen geeignet, um meine Bedürfnisse finden. Ich schaffte es mit verschiedenen Antworten über das Netz zu experimentieren, bis ich kam mit diesem (funktioniert super!). Ich dachte, ich würde teilen, da dieser Beitrag das Top-Ergebnis über Google ist.

    ''''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

Als erstes müssen Sie den System-Namespace in Ihre Anwendung importieren und dann eine Instanz des erstellen System.Net.NetworkInformation.IPAddressInformation und es als solches verwendet

Beispiel

  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

Beachten Sie, dass ich den (0) Index geändert (1).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top