C#中的IPv6到IPv4互转

5
我有一个IP地址列表,格式为IPv4,这些地址是从之前Web服务器接收到的HttpRequest对象中收集的。我有一个Java小程序,它以IPv6格式返回IP地址(Java小程序返回一堆数据和IP地址)。我需要检查小程序返回的IP是否与列表中的任何项匹配。
如何相互转换IPv6和IPv4格式?
我的Web应用程序是基于ASP.Net C#构建的。
编辑
以下是我遇到的问题。 Java小程序从客户端返回一堆IP地址,我假设这取决于客户机器上的网络卡数量。
除此之外,我还从ASP.Net HTTPRequest对象中获得一个IP地址。我需要找出实际用于连接到我的网站并执行某些任务的IP地址。
问题是有时候我只从Java小程序中获取一个IPv6格式的IP,而我从HTTP请求对象中获得的IP是IPv4格式的,因此比较失败了。
3个回答

4
你在谈论IPv4-IPv6映射或IPv4地址嵌入。
IPv4地址嵌入用于创建IPv4地址和IPv6地址之间的关系,以帮助从IPv4向IPv6的过渡。其中一种类型是IPv4兼容的IPv6地址,用于同时兼容IPv4和IPv6的设备;它以96个零位开头。另一种是IPv4映射地址,用于将不兼容IPv6的IPv4设备映射到IPv6地址空间中;它以80个零位开头,后跟16个1。

..

这两种地址之间的区别微妙但重要。前80位始终为零,因此当看到时,您知道它是某种嵌入式IPv4地址。仅对实际支持IPv6的设备使用IPv4兼容IPv6地址;IPv4兼容地址除了常规IPv6地址外还有。相比之下,如果在初始80位后看到“FFFF”,则指定了将其IPv4地址映射到IPv6格式的传统IPv4设备。它不是一个IPv6能力设备。

因此,总的来说,除非它们被映射在一起,否则您将无法进行转换。您需要一个翻译器


3

0A0D 似乎已经回答了这个问题,但我也来试一下:

如果你的IPv6地址的前10个字节(80位)都是零,则可以将后4个字节与IPv4地址的4个字节进行比较。

bool AreEquivalent(IPAddress ip6addr, IPAddress ip4addr)
{
  byte[] ip6bytes = ip6addr.GetBytes();
  byte[] ip4bytes = ip4addr.GetBytes();
  for (int i = 0; i < 10; i++)
  {
     if (ip6bytes[i] != 0)
       return false;
  }
  for (int i = 0; i < 4; i++)
  {
     if (ip6bytes[i + 12] != ip4bytes[i])
        return false;
  }
  return true;
}

假设您已经知道什么是IPv6和IPv4。如果您需要比较任意地址,请根据需要添加额外的逻辑。


上面的代码似乎不完整。根据标准,除了上述内容外,您还需要检查IPv6地址中的第10和11个字节。对于“IPv4兼容IPv6地址”,它们需要为0,而对于“IPv4映射IPv6地址”,它们需要为FF。 - Florin Dumitrescu

2
假设您正在使用某种无线平台或具备进行无线通信的能力。 IPV6与移动网络,也就是“无线”有关。将IPV6转换为IPV4不是您要寻找的。IPV6是一个真实的地址。这是现在IP地址的新高级标准。请看这里,并自行决定。您也可以手动进行转换,在此处进行。IPV6应该掩盖您的IPV4。
希望对您有所帮助。

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