首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android上的getaddrinfo返回错误EAI_BADFLAGS

Android上的getaddrinfo返回错误EAI_BADFLAGS
EN

Stack Overflow用户
提问于 2016-09-24 16:18:54
回答 2查看 1.4K关注 0票数 5

我们正在尝试在Android API14和更高版本上使用getaddrinfo (在使用NDK r12的C++代码中),以从IPV6地址获取合成的IPV4地址。这适用于采用NAT64的纯IPV6网络。但是,如果设置了aiflags (AI_V4MAPPED | AI_ADDRCONFIG),则getaddrinfo返回EAI_BADFLAGS。

代码语言:javascript
运行
复制
        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有什么主要区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
运行
复制
    if (hints->ai_flags & ~AI_MASK)
        ERR(EAI_BADFLAGS);

和这里的第153-170行:https://android.googlesource.com/platform/bionic/+/085543106/libc/include/netdb.h

代码语言:javascript
运行
复制
/*
 * 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禁止设置它)。

票数 8
EN

Stack Overflow用户

发布于 2018-03-30 15:40:09

rfc7050中,我们可以找到如何从IPv4地址合成IPv6地址的解决方案。你也可以参考nativePrintIPv6Prefix

使用IPv6前缀,您可以轻松合成IPv6地址。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39674147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档