Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中IPv6到IPv4的相互转换#_C#_Asp.net_Ipv6_Applet_Ipv4 - Fatal编程技术网

C# C语言中IPv6到IPv4的相互转换#

C# C语言中IPv6到IPv4的相互转换#,c#,asp.net,ipv6,applet,ipv4,C#,Asp.net,Ipv6,Applet,Ipv4,我有一个IPv4格式的IP列表,这些IP是从我的web服务器收到的以前的HttpRequest对象收集的。我有一个java小程序,它以Ipv6格式提供IP地址(java小程序返回一组数据以及IP地址)。我需要检查小程序返回的IP是否与列表中的任何项目匹配 如何相互转换IPv6和IPv4格式 我的web应用程序是基于ASP.Net C构建的 编辑 这是我面临的问题。Java小程序从客户机返回一组IP,我认为这取决于客户机拥有的网卡数量 除此之外,我还从ASP.Net HTTPRequest对象获得

我有一个IPv4格式的IP列表,这些IP是从我的web服务器收到的以前的HttpRequest对象收集的。我有一个java小程序,它以Ipv6格式提供IP地址(java小程序返回一组数据以及IP地址)。我需要检查小程序返回的IP是否与列表中的任何项目匹配

如何相互转换IPv6和IPv4格式

我的web应用程序是基于ASP.Net C构建的

编辑

这是我面临的问题。Java小程序从客户机返回一组IP,我认为这取决于客户机拥有的网卡数量

除此之外,我还从ASP.Net HTTPRequest对象获得了一个IP地址。我需要找出哪个IP实际上是用来连接到我的网站和执行一些任务


问题是,有时我只能从javaapplet获取一个IPv6格式的IP,而我从HTTPRequest对象获取的IP是IPv4格式的,因此比较失败。

您指的是IPv4-IPv6映射或IPv4地址嵌入

IPv4地址嵌入用于 在IPv4服务器之间创建关系 地址和IPv6地址,以帮助 从IPv4到IPv6的过渡。一个 类型,与IPv4兼容的IPv6 地址,用于以下设备: 兼容IPv4和IPv6;信息技术 以96个零位开始。其他的, IPv4映射地址,用于 映射未配置的IPv4设备 兼容IPv6进入IPv6 地址空间;它以80开头 0后面跟着16个1

这两种地址之间的差别很微妙,但是 重要的。前80位是 总是零,所以当看到你的时候 知道它是的嵌入式IPv4地址 某种程度上。IPv4兼容IPv6 地址仅用于设备 实际上是IPv6感知的;这个 此外,还提供了与IPv4兼容的地址 到它的传统IPv6地址。在里面 相反,如果“FFFF”被视为 初始值80后的16位,这是 指定一个传统的IPv4设备 其IPv4地址已映射 转换为IPv6格式。这不是一个问题 支持IPv6的设备


因此,底线是,除非它们映射在一起,否则您将无法转换为/从。您需要一个。

假设您使用某种无线平台或有能力进行无线操作。 IPV6与移动网络(又称“无线”)的改进有关。将IPV6转换为IPV4不是您想要的。IPV6是一个真正的地址。它是当今IP地址的新的高级标准。看一看,自己决定。您也可以手动执行此操作。IPV6应该屏蔽您的IPV4


希望能有所帮助。

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;
}
bool是等效的(IPAddress ip6addr、IPAddress ip4addr)
{
字节[]ip6bytes=ip6addr.GetBytes();
byte[]ip4bytes=ip4addr.GetBytes();
对于(int i=0;i<10;i++)
{
如果(IP6字节[i]!=0)
返回false;
}
对于(int i=0;i<4;i++)
{
如果(IP6字节[i+12]!=IP4字节[i])
返回false;
}
返回true;
}

这假设您已经知道什么是ipv6和ipv4。如果需要比较任意地址,请酌情添加额外的逻辑。

上面的代码似乎不完整。根据,除上述内容外,还需要检查IPv6地址上的字节10和11。对于“IPv4兼容IPv6地址”,它们必须为0;对于“IPv4映射IPv6地址”,它们必须为FF。