6

我正在尝试获取本地 PC 的 ip 地址,而我的另一台 PC 的 v4 地址很好,但在这台计算机上的代码:

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

返回我猜是 IPv6 地址:

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

如何获取 IPv4 地址?

4

8 回答 8

9

免责声明- 我没有安装 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()

这可能会爆炸,因此不要将其视为生产代码。

于 2009-10-29T08:32:15.853 回答
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)。如果您正在寻找其他东西,您可以删除或修改该部分。

于 2011-04-27T20:43:09.427 回答
1

我使用了一个组合的 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 " & Application.StartupPath & " && ipconfig >> " & ResString & "&& 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 & Ipv4Str.Chars(Ipv4Char)
                        'Read results step by step
                    Loop
                Catch ex As Exception
                End Try
                MsgBox("Your IPv4 Address is " & Ipv4)
                Ipv4Found = True
                Ipv4Reader.Close()

            End If
        Else

        End If
    Loop

如果您的计算机语言是英语,您可能在 IPv4 字符串中有一些不寻常的字符(我的电脑实际上是意大利语)

于 2020-03-22T15:03:05.607 回答
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.

于 2012-05-31T08:45:07.567 回答
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
于 2014-05-23T03:32:13.983 回答
0

我自己正在寻找这个问题的答案,但找不到适合我需要的答案。我设法在网上尝试了各种答案,直到我想出了这个(效果很好!)。只是想我会分享,因为这篇文章是谷歌的最高结果。

    ''''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
于 2014-06-18T17:52:58.263 回答
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
于 2014-07-16T19:31:00.150 回答
0
 Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
 txtLocal.Text = localIp.AddressList(1).ToString

请注意,我将(0)索引更改为(1).

于 2016-09-01T10:48:39.497 回答