无法从DNS64(iOS)返回IPv6地址

时间:2016-05-17 16:29:12

标签: ios iphone dns ipv6

鉴于Apple最近宣布所有新的移动应用程序需要在6月支持“仅IPv6”,我使用他们的DNS64 / NAT64设置(描述here)来尝试测试我的应用程序。

我无法通过此设置使DNS64正常工作。特别是,当我尝试使用getaddrinfo()对任何地址进行DNS查找时,我得到了EAI_NONAME。这是我正在使用的确切代码:

struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Stream socket */
hints.ai_flags = 0;
hints.ai_protocol = 0;          /* Any protocol */ 

int result;
struct addrinfo *addrinfo;

NSString *hostString = @"yahoo.com";

result = getaddrinfo([hostString UTF8String], NULL, &hints, &addrinfo);

if (result == 0) {
    NSLog(@"worked");
    struct sockaddr_storage stor = *( (struct sockaddr_storage *) addrinfo->ai_addr);
    NSLog(@" result = %@", [AppDelegate inet_ntoa_r:stor]);
}
else 
{
    NSLog(@"bad, error = %i (%@)", result, hostString);
}

我知道这段代码是正确的,因为当我切换到我的本地互联网提供商时,我实际上能够获得为yahoo.com返回的IPv6地址。但是,我不认为这是Apple正在寻找的“仅IPv6”环境,因此我希望能够使用他们的NAT64 / DNS64。

为了验证,我在App Store上使用IPv6 Toolkit App进行了测试,并看到了相同的结果。

此时我认为DNS64需要一些额外的配置,但我不确定它会涉及到什么。

编辑:通过此DNS64测试网站test-ipv6会出现错误“我们的测试显示您的IPv6设置已损坏或配置错误,这将导致网站启用Ipv6时出现问题”。所以Apple的DNS64或我的配置肯定有问题。有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

if (result == 0)
{
    NSLog(@"worked");
    struct sockaddr_storage stor = *( (struct sockaddr_storage *) addrinfo->ai_addr);

    //
    char host[1024];
    char serv[20];
    struct addrinfo * res = addrinfo;

    getnameinfo(res->ai_addr, sizeof(struct sockaddr), host, sizeof(host), serv, sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV);
    NSString * stringHost = [NSString stringWithUTF8String:host];
    NSString * stringPort = [NSString stringWithUTF8String:serv];

    NSString * string = [NSString stringWithFormat:@"%@: %@: %@", res->ai_family == AF_INET ? @"IPv4" : (res->ai_family == AF_INET6 ? @"IPV6" : @"Unknown"), stringHost, stringPort];
    NSLog(@"---- %@", string);  //IPV6: 64:ff9b::cebe:242d
}