2016-09-24 74 views
1

我們試圖在Android API 14及更高版本(使用NDK r12的C++代碼中)上使用getaddrinfo從IPV4地址獲取合成的IPV6地址。這適用於帶有NAT64的僅IPV6網絡。但是,如果設置了aiflags,則getaddrinfo會返回EAI_BADFLAGS(AI_V4MAPPED | AI_ADDRCONFIG)。Android上的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有什麼大的不同嗎?

回答

6

是的,與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_BADFLAGSAI_MASK。此外,實際上在仿生中沒有任何地方使用AI_V4MAPPED,並且在評論之外只提及AI_ADDRCONFIG(並且因爲getaddrinfo禁止設置它,所以似乎你永遠不能實際達到它)。

+0

謝謝,這相當多的答案。這是否意味着Android上實現的getaddrinfo無法生成IPV6合成地址 – tech74

+0

是的,所以它看起來像。 – mstorsjo

+0

只是想知道是否有任何Java API可以從IPV4文字生成合成的IPV6地址,如果getaddrinfo無法做到這一點 – tech74