在IPv6表示法中比较IPv4地址

3

在通过ipv4进行传入连接时,IPAddress以ipv6表示法表示,例如::ffff:1.2.3.4

我想将这些地址与从其他地方获取的以ipv4表示法表示的IPAddress进行比较:1.2.3.4

所谓表示法是指ipv4.GetAddressBytes()返回4个字节,而ipv6.GetAddressBytes()返回16个字节。

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

我认为我知道如何逐字节执行此操作,但我可能会错过某些内容,如果存在现有函数,我宁愿使用它。


1
你能从你的v6源中取出IPv4部分,并将其与其他“本机”IPv4进行比较吗?例如:::ffff:1.2.3.4 => 1.2.3.4 - Jason
是的,无论哪种方式都可以,因为我只是要比较它们。 - hultqvist
2个回答

3

将您的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地址/网络适配器)。


2
“.MapToIPvX()” 正是我所需要的。在我的情况下,网络适配器不是问题,因为我正在将传入连接与 DNS 记录进行比较。您可能需要添加这些映射方法仅适用于 4.5 框架。 - hultqvist

0
从您的“源”中获取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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接