2017-08-08 163 views
0

我试图从Android中的IPv4地址(本地代码或Java本身)合成IPv6地址,如RFC-7050中所记录,以便在NAT64后面使用。在Android上从IPv4地址合成IPv4映射的IPv6地址?

在iOS中工作时,此选项可通过调用getaddrinfo获得,但似乎Android的getaddrinfo实现将仅合成主机名的IPv6,而不是IPv4地址。

在iOS上,在NAT64后面,以下代码将在变量res的地址列表中生成合成的IPv6地址。但是,在Android上,相同的本地代码将生成IPv4地址,除非我将主机名而不是IPv4地址传递到getaddrinfo

struct addrinfo *res; 
getaddrinfo("x.x.x.x", "80", NULL, &res); 

编辑

我不知道Android实现CLAT/464lat,但这并不涵盖所有设备和网络。一个最好的例子就是仅有IPv4网络的NAT64网络。

例子:互联网 - >仅IPv4网络 - >NAT64网络 - >客户

客户将有RFC-4193下(我相信)一个本地的IPv6地址,但只能通过它的NAT64网关访问互联网,这意味着NAT64在向上游发送它们之前将不得不翻译地址。

所以我需要的是产生合成的IPv6地址

前缀理想的方式,我们需要以到达终点的IPv4合成IPv6地址。

回答

2

这可能是也可能不是你一个答案:

不需要合成Android上的地址。它具有464xlat模拟NAT64网络上的IPv4堆栈,因此您的应用程序可以使用IPv4,Android将负责幕后映射。

iOS和Android的区别在于Android在堆栈中实现了IPv4仿真。苹果决定,他们希望保持IP堆栈清洁并为开发人员提供工具(如getaddrinfo)自己做映射。不同的设计决策。

+0

从我所了解的464xlat实现不支持WiFi。存在使用仅位于IPv4上游网络后面的NAT64的网络。即“Internet-> IPv4 Only Network-> NAT64 Network-> Client',我试图解释这种情况。 –