【问题标题】:Compare ipv4 addresses in ipv6 notation以 ipv6 表示法比较 ipv4 地址
【发布时间】:2013-05-13 04:45:39
【问题描述】:

在通过 ipv4 的传入连接上,IPAddress 采用 ipv6 表示法,例如 ::ffff:1.2.3.4

我想将这些地址与我从其他地方获得的IPAddress 进行比较,该地址采用 ipv4 表示法:1.2.3.4

我的意思是 ipv4.GetAddressBytes() 返回 4 个字节,而 ipv6.GetAddressBytes() 返回 16 个字节。

有没有一种简单的方法可以将 ipv4 IPAddress 转换为 ipv6 表示法?

我想我知道如何逐字节进行,但我可能会遗漏一些东西,如果有的话,我宁愿使用现有的函数。

【问题讨论】:

  • 您能否从您的 v6 源中提取 IPv4 部分并与其他“本机”IPv4 进行比较?例如::ffff:1.2.3.4 => 1.2.3.4
  • 是的,无论哪种方式都有效,因为我只是比较它们。

标签: c# .net ip-address ipv6 ipv4


【解决方案1】:

将您的 IP 地址实例化为 System.Net.IPAddress 的实例。看看以下方法:

  • IPAddress.Equals()
  • IPAddress.MapToIPv4()
  • IPAddress.MapToIPv6()

您可能希望为特殊地址添加特殊处理(例如 TCP/IP 环回适配器:这是一个单一的 IPv6 地址,::1,而对于 IPv4,即使用于该目的最常用的地址也是如此是127.0.0.1,IETF 已为此目的保留了整个 127/8 块(127.0.0.0127.255.255.255)。如何确定相等性(甚至等价性)是有争议的。

由于 IPv4 和 IPv6 是完全不同且独立的寻址方案,有人可能会合理地争论说,确定等效性的唯一真正方法是它们是否都映射到同一个端点(MAC 地址/网络适配器)。

【讨论】:

  • .MapToIPvX() 正是我想要的。在我的情况下,网络适配器不是问题,因为我正在将传入连接与 DNS 记录进行比较。您可能会补充一点,地图方法仅在 4.5 框架中可用。
【解决方案2】:

从“源”中获取 IPv4 部分并与“目标”IPv4 进行比较,如下例所示

IPAddress ipv6 = null;
IPAddress ipv4 = null;
IPAddress testIp = null;

IPAddress.TryParse("::ffff:1.2.3.4", out ipv6);
IPAddress.TryParse("1.2.3.4", out ipv4);

string ipString = ipv6.ToString();
IPAddress.TryParse(ipString.Substring(ipString.LastIndexOf(":") + 1), out testIp);
// this will return false
Console.WriteLine("ipv4 == ipv6 : " + (ipv4.Equals(ipv6)).ToString());
// this will return true
Console.WriteLine("ipv4 == testIp : " + (ipv4.Equals(testIp)).ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多