我们正在尝试在Android API14和更高版本上使用getaddrinfo (在使用NDK r12的C++代码中),以从IPV6地址获取合成的IPV4地址。这适用于采用NAT64的纯IPV6网络。但是,如果设置了aiflags (AI_V4MAPPED | AI_ADDRCONFIG),则getaddrinfo返回EAI_BADFLAGS。
struct addrinfo *ai, hints;
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
hints.ai_family = AF_UNSPEC;
int error = getaddrinfo( "46.23.43.12", "80", &hints, &ai);
if( error == 0)
与Linux有什么主要区别吗?
发布于 2016-09-24 18:01:49
是的,与linux的一些不同之处在意料之中。尽管Android运行在Linux内核上,libc,bionic,在很大程度上是基于BSD的(它的一些部分也来自一个相当老的版本,尽管这是最近更新的)。
我不确定是否有任何关于这方面的明确文档,但您可以检查实现,以了解其可能的行为方式。
请参阅这里的617-718行:https://android.googlesource.com/platform/bionic/+/085543106/libc/dns/net/getaddrinfo.c
if (hints->ai_flags & ~AI_MASK)
ERR(EAI_BADFLAGS);
和这里的第153-170行:https://android.googlesource.com/platform/bionic/+/085543106/libc/include/netdb.h
/*
* Flag values for getaddrinfo()
*/
#define AI_PASSIVE 0x00000001 /* get address to use bind() */
#define AI_CANONNAME 0x00000002 /* fill ai_canonname */
#define AI_NUMERICHOST 0x00000004 /* prevent host name resolution */
#define AI_NUMERICSERV 0x00000008 /* prevent service name resolution */
/* valid flags for addrinfo (not a standard def, apps should not use it) */
#define AI_MASK \
(AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | \
AI_ADDRCONFIG)
#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */
#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */
/* special recommended flags for getipnodebyname */
#define AI_DEFAULT (AI_V4MAPPED_CFG | AI_ADDRCONFIG)
因此,如果您设置了AI_MASK
中列出的标志之外的任何标志,则getaddrinfo将返回EAI_BADFLAGS
。此外,实际上在bionic中并没有使用AI_V4MAPPED
,而且在注释之外只有一次提到了AI_ADDRCONFIG
(而且似乎你永远都无法真正接触到它,因为getaddrinfo
禁止设置它)。
发布于 2018-03-30 15:40:09
从rfc7050中,我们可以找到如何从IPv4地址合成IPv6地址的解决方案。你也可以参考nativePrintIPv6Prefix。
使用IPv6前缀,您可以轻松合成IPv6地址。
https://stackoverflow.com/questions/39674147
复制相似问题