2016-09-24 12 views
1

私たちはIPV4アドレスから合成IPV6アドレスを取得するために、Android API 14以上(NDK r12を使用するC++コードで)でgetaddrinfoを使用しようとしています。これは、NAT64を使用するIPV6のみのネットワークで使用するためのものです。しかし、getaddrinfoは、aiflagsが設定されていれば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(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) 

だから、getaddrinfoは戻っEAI_BADFLAGSあなたはに列挙されているものの外のいずれかのフラグを設定している場合AI_MASK。さらに、実際にはバイオニック内のどこにでもAI_V4MAPPEDは使用されておらず、AI_ADDRCONFIGというコメントの外に1つの言及しかありません(getaddrinfoはそれを設定することを禁じます)。

+0

ありがとう、それはかなりそれに答える。これは、Androidで実装されているgetaddrinfoがIPV6合成アドレスを生成できないことを意味しますか? – tech74

+0

はい、そうです。 – mstorsjo

+0

getaddrinfoができない場合、IPV4リテラルから合成IPV6アドレスを生成できるJava APIがあるかどうか疑問です – tech74

関連する問題