tec*_*h74 2 sockets linux networking android android-ndk
我们尝试在Android API 14及更高版本上使用getaddrinfo(使用NDK r12的C++代码)从IPV4地址获取合成的IPV6地址.这适用于仅具有NAT64的IPV6网络.但是,如果设置了aiflags,则getaddrinfo返回EAI_BADFLAGS(AI_V4MAPPED | AI_ADDRCONFIG).
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)
Run Code Online (Sandbox Code Playgroud)
Linux有什么重大差异吗?
是的,预计会有一些与linux的差异.即使Android在Linux内核,libc中,仿生运行,是相当多基于BSD(它的某些部分是从一个很老的版本,以及,虽然已经带来最新最近).
我不确定是否有关于此的明确文档,但您可以检查实现以了解它可能的行为方式.
请参见线617-718的位置: https://android.googlesource.com/platform/bionic/+/085543106/libc/dns/net/getaddrinfo.c
if (hints->ai_flags & ~AI_MASK)
ERR(EAI_BADFLAGS);
Run Code Online (Sandbox Code Playgroud)
和线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)
Run Code Online (Sandbox Code Playgroud)
因此,EAI_BADFLAGS
如果您在其中列出的标志之外设置任何标志,则getaddrinfo将返回AI_MASK
.此外,实际上没有使用AI_V4MAPPED
仿生学中的任何地方,只有一个提到AI_ADDRCONFIG
评论之外(似乎你不能真正达到它,因为getaddrinfo
禁止设置它).