0

我试图在 Visual Basic 2012 中将 IPv6 地址(那些带有嵌入 IPv4 地址的 IPv6 地址)“表示”为其等效的 IPv4 地址。以下是我用于相同的代码片段:

Dim ip As IPAddress = IPAddress.Parse(strIP)
Dim ipv4 As IPAddress
Dim ipStr As String = ip.ToString()
IPAddress.TryParse(ipStr.Substring(ipStr.LastIndexOf(":") + 1), ipv4)
Console.Writeline(ipv4.MapToIPv4().ToString)

但是对于环回接口(127.0.0.1),ipv6 表示似乎是 ::1 而不是 0:0:0:0:0:ffff:7f00:1?这个地址是唯一的“偏差”吗?还有其他需要“特殊”处理的地址吗?

谢谢!

4

2 回答 2

1

您无法将 IPv6 地址“转换”为 IPv4,因此我不确定您要实现什么。

你指的是IPAddress.IsIPv4MappedToIPv6物业吗?这不是一回事。请注意,此属性是在 .Net 4.5 中引入的,因此在 VB2012 中不起作用

您说 IPv6 的环回地址是正确的::1

不确定这是否有帮助,但您可以将字符串解析为 .Net IPAddress 并检查IPAddress.AddressFamily属性以查看它是否设置为InternNetworkV6IPAddress 是否为 v6。

例如

Dim ip1 As IPAddress = IPAddress.Parse("::1")
Dim ip2 As IPAddress = IPAddress.Parse("127.0.0.1")
Debug.WriteLine("Is ip1 a v6 address:" + (ip1.AddressFamily = Sockets.AddressFamily.InterNetworkV6).ToString)
Debug.WriteLine("Is ip2 a v6 address:" + (ip2.AddressFamily = Sockets.AddressFamily.InterNetworkV6).ToString)

输出:

Is ip1 a v6 address:True
Is ip2 a v6 address:False
于 2014-02-25T15:52:21.420 回答
0

我的理解是 .NET(在我的测试中是 v3.5 到 4.5.2)将返回带有两个冒号的 IPv6 地址,如下所示 -

Dim host As String = Dns.GetHostName()
Dim ip As IPHostEntry = Dns.GetHostEntry(host)
Console.WriteLine(ip.AddressList(0).ToString())
Console.ReadKey()

在我的情况下,它输出 fe80::2d36:51be:16dc:257b%36,通过网关到 ADSL 调制解调器的无线连接。我对您的问题的兴趣是我想返回 IPv4 地址,我知道它是 203.214.36.136(直到我重置调制解调器)。我可以通过登录我的 ISP 或使用这样的代码来看到这一点 -

Using client = New WebClient()
    Dim ret As String = client.DownloadString("http://icanhazip.com/").Trim()
    Console.WriteLine(ret)
    Console.ReadKey()
    client.Dispose()
 End Using

使用的网页将返回一个 IPv4 IP 地址(我可以通过登录到我的 ADSL 调制解调器和我的 ISP 的网页来验证它是正确的)。我不确定页面上的哪些代码重定向以返回 IP 地址(我从一个也处理 IP 地址的 SO 答案中复制了这个)。

尝试使用 .MaptoIPv4 的代码(当然我使用 VS2012 或 2013,以及 .NET v4.5)我还为 ipv4 (你的变量)使用了空值,但是从我上面的第一个代码块返回的字符串值,对于你的变量strIP。

它失败了。

我仍在努力弄清楚应该如何使用这些方法。

[编辑] 实际上,我错误地假设主机 AddressList 中的第一个 IP 地址是我想要的。有 3 个,其中 2 个是 IPv6,一个是 IPv4,它是我的调制解调器的网关。

所以我对解决方案的贡献不大。对不起。

于 2014-10-25T23:57:51.770 回答