鉴于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或我的配置肯定有问题。有什么想法吗?
答案 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
}