2013-05-17 92 views
3

在通过IPV4的IPAddress传入连接是在IPv6的符号如::ffff:1.2.3.4比较IPv4地址以IPv6表示法

我想这些地址比较的IPAddress我从别的地方是在IPv4表示法: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

+0

是的,任何一种方式都可以,因为我只是要比较它们。 – hultqvist

回答

2

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

+1

'.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());