我尝试从Android中的IPv4地址(本机代码或Java本身)合成IPv6地址,如RFC-7050中所述,以便在NAT64后面使用。
在iOS中工作时,通过调用getaddrinfo
可以使用此选项,但似乎Android getaddrinfo
的实现只会为主机名而不是IPv4地址合成IPv6。
在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地址生成前缀的方法
理想情况下,我们需要合成IPv6地址才能到达IPv4端点。
答案 0 :(得分:2)
这可能是也可能不是你的答案:
您不需要在Android上合成地址。它有464xlat模拟NAT64网络上的IPv4堆栈,因此您的应用程序可以使用IPv4,Android将负责幕后的映射。
iOS和Android之间的区别在于Android在堆栈中实现了IPv4仿真。 Apple决定让他们保持IP堆栈的清洁,并为开发人员提供工具(如getaddrinfo
)来自行进行映射。不同的设计决定。