zoukankan      html  css  js  c++  java
  • 对 getaddrinfo Android 返回错误 EAI_BADFLAGS

    我们尝试使用 getaddrinfo 对 Android API 14 及以上 (在 c + + 代码使用 NDK r12) 从 IPV4 获得合成的 IPV6 地址 address 。这是在 IPV6 与 NAT64 的唯一网络上使用。但是如果设置了 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)

    有任何重大差异从 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);

    线 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)

    所以 getaddrinfo 返回 EAI_BADFLAGS 如果您设置任何标志,那些还没列入 AI_MASK 。此外,还有实际上没有使用 AI_V4MAPPED 仿生,也是唯一一次提到内的任意位置 AI_ADDRCONFIG 在评论 (似乎你可以永远不会达到它自 getaddrinfo 禁止设置它)。

  • 相关阅读:
    ByteBuffer用法总结
    内部类访问外部同名属性或者方法
    floodlight 学习(一)
    ubuntu 更改文件所有者
    python cmd 模块
    matlab 矩阵
    python操作MySQL数据库
    Win 7 下制作 mac 系统启动U盘
    Window 常用命令
    大数据扫盲
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/7542773.html
Copyright © 2011-2022 走看看