比较ipv6表示法中的ipv4地址

时间:2013-05-17 22:29:37

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

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

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

用符号表示ipv4.GetAddressBytes()返回4个字节,而ipv6.GetAddressBytes()返回16个字节。

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

我想我知道如何逐字节地做,但我可能会错过一些东西,如果有的话,宁愿使用现有的函数。

2 个答案:

答案 0 :(得分:2)

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

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

您可能希望为特殊地址添加特殊处理(例如TCP / IP环回适配器:这是单个IP​​v6地址::1,而对于IPv4,即使最常用的地址为该目的是127.0.0.1,IETF为此目的保留了整个 127/8块(127.0.0.0 - 127.255.255.255包含)。如何确定相等(或甚至是等同的)是值得商榷的。

由于IPv4和IPv6是完全不同且独立的寻址方案,因此可以合理地认为确定等效性的唯一真正方法是它们是否映射到同一端点(MAC地址/网络适配器)。

答案 1 :(得分: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());