1

我有这个查询IP地址的功能。

Dim strHostName As String
Dim strIPAddress As String 

Public Function ipconfig()
  strHostName = System.Net.Dns.GetHostName()
  strIPAddress = System.Net.Dns.GetHostEntry(strHostName).AddressList(0).ToString()

  rtb_Output.Text = rtb_Output.Text + "Computer Name: " & strHostName + Environment.NewLine + "IP Address: " &strIpAddress
End Function

它在我的 Windows 7 桌面有线连接上运行良好,并按预期返回 IPv4 地址。当我在我的 Windows 8 平板电脑上以有线或无线方式运行它时,它会返回 IPv6 地址,而我需要 IPv4 地址。你有什么想法为什么,或者我怎样才能让它返回 IPv4 地址?

4

4 回答 4

2

您的 Windows 8 机器只有 IPv6 地址似乎不太可能,但肯定不是不可能。但是,关闭任何操作系统的网络适配器上的 IPv6 支持并不少见,因为它尚未得到普遍支持。检查每台计算机的适配器以验证地址并与您的结果进行比较。

无论如何,建议您假设您的查询将返回 IPv6、IPv4 等类型的多个地址以及任何类型的倍数。如果您正在寻找特定类型,请使用AddressFamily属性来识别类型。

例如,仅适用于 IPv4:

Dim hostEntry = Dns.GetHostEntry(hostNameOrAddress)

    Dim addressList As New List(Of IPAddress)

    For Each address In hostEntry.AddressList
        If address.AddressFamily = Sockets.AddressFamily.InterNetwork Then
            addressList.Add(address)
        End If
    Next

    Return addressList
于 2013-12-07T15:24:20.630 回答
0
 Public Function GetIPv4Address()
        GetIPv4Address = String.Empty
        Dim strmachine As String = System.Net.Dns.GetHostName()
        Dim iphe As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(strmachine)

        For Each ipheal As System.Net.IPAddress In iphe.AddressList
            If ipheal.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork Then
                GetIPv4Address = ipheal
               ' MsgBox(ipheal.ToString, MsgBoxStyle.Critical, "ERROR")

           End If
        Next

    End Function
于 2014-10-14T15:38:22.057 回答
0

您可以使用LINQ过滤结果:

Dim ipHostEntry = Dns.GetHostEntry(Dns.GetHostName)
Dim ipAddress = ipHostEntry.AddressList.FirstOrDefault(Function(ip) ip.AddressFamily = AddressFamily.InterNetwork)
If ipAdress IsNot Nothing Then
  ' Output ipAdress.ToString()
Else
  ' No IPv4 address could be retrieved
End If

说明: IPHostAddress.AddressList返回一个Array(Of IPAddress)实现IEnumerable接口的,因此可以被 LINQ 表达式枚举。

FirstOrDefault将返回 AddressList 数组中与作为 的第一个也是唯一参数提交的谓词 lambda 函数匹配的第一个元素FirstOrDefault。必须编写谓词函数以返回布尔值。

数组从第一个元素迭代到最后一个元素,并对每个元素求值 lambda 函数,其参数ip是当前迭代项。用ip.AddressFamily = AddressFamily.InterNetwork我们判断当前项是否为 IPv4 地址。如果是这样,则表达式计算true并返回项目FirstOrDefault。如果计算结果为false,则检查数组中的下一项,依此类推。如果没有元素与谓词匹配,则FirstOrDefault返回默认值,在这种情况下Nothing(注意:扩展First的工作方式相同,但如果没有项目与谓词匹配,则抛出异常;两者都First可以FirstOrDefault在没有任何参数的情况下调用,它们返回的第一个元素那么序列)。

我更喜欢上面基于扩展方法的表示法,但如果您愿意,也可以使用原始的From In Where SelectLINQ 表示法:

Dim ipAddress = (From ip In ipHostEntry.AddressList
                 Where ip.AddressFamily = AddressFamily.InterNetwork
                 Select ip)(0)

请注意,在这种情况下,这(0)是另一个扩展方法的参数。ElementAtOrDefault(index As Integer)

于 2014-02-15T13:48:56.913 回答
0

你可以使用这个:

System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName).AddressList.First.ToString()

于 2013-12-07T15:08:10.867 回答