2012-05-26 21 views
1

我可以尝试使用GetAddrInfo解决ipv6.google.com的getaddrinfo无法解决ipv6.google.com(但NSLOOKUP可以)

wsaError = getaddrinfo("ipv6.google.com", null, null, ref addrInfo); 

返回套接字错误代码是11001(没有这样的主机是已知的)。

Note: The deprecated legacy function GetHostByName does not support IPv6. It has been replaced with GetAddrInfo .

但奇怪的是,我可以使用nslookup,它可以找到的地址就好了:

问题

SendRequest(), len 33 
    HEADER: 
     opcode = QUERY, id = 4, rcode = NOERROR 
     header flags: query, want recursion 
     questions = 1, answers = 0, authority records = 0, additional = 0 

    QUESTIONS: 
     ipv6.google.com, type = A, class = IN 

权威答案

Got answer (106 bytes): 
    HEADER: 
     opcode = QUERY, id = 4, rcode = NOERROR 
     header flags: response, want recursion, recursion avail. 
     questions = 1, answers = 1, authority records = 1, additional = 0 

    QUESTIONS: 
     ipv6.google.com, type = A, class = IN 
    ANSWERS: 
    -> ipv6.google.com 
     type = CNAME, class = IN, dlen = 9 
     canonical name = ipv6.l.google.com 
     ttl = 21743 (6 hours 2 mins 23 secs) 
    AUTHORITY RECORDS: 
    -> l.google.com 
     type = SOA, class = IN, dlen = 38 
     ttl = 30 (30 secs) 
     primary name server = ns4.google.com 
     responsible mail addr = dns-admin.google.com 
     serial = 1486713 
     refresh = 900 (15 mins) 
     retry = 900 (15 mins) 
     expire = 1800 (30 mins) 
     default TTL = 60 (1 min) 

非权威的问题

SendRequest(), len 33 
    HEADER: 
     opcode = QUERY, id = 5, rcode = NOERROR 
     header flags: query, want recursion 
     questions = 1, answers = 0, authority records = 0, additional = 0 

    QUESTIONS: 
     ipv6.google.com, type = AAAA, class = IN 

非权威的答案

Got answer (82 bytes): 
    HEADER: 
     opcode = QUERY, id = 5, rcode = NOERROR 
     header flags: response, want recursion, recursion avail. 
     questions = 1, answers = 2, authority records = 0, additional = 0 

    QUESTIONS: 
     ipv6.google.com, type = AAAA, class = IN 
    ANSWERS: 
    -> ipv6.google.com 
     type = CNAME, class = IN, dlen = 9 
     canonical name = ipv6.l.google.com 
     ttl = 21743 (6 hours 2 mins 23 secs) 
    -> ipv6.l.google.com 
     type = AAAA, class = IN, dlen = 16 
     AAAA IPv6 address = 2607:f8b0:4009:801::1012 
     ttl = 270 (4 mins 30 secs) 

------------ 
Name: ipv6.l.google.com 
Address: 2607:f8b0:4009:801::1012 
Aliases: ipv6.google.com 

什么能导致nslookup能够当GetAddrInfo无法解析地址?我能做些什么与GetAddrInfo有什么不同,所以它的工作原理?

回答

2

尝试通过AF_INET6pHints参数与IPV6地址一起使用。这似乎对我有用:

struct addrinfo *result = NULL; 
struct addrinfo hints; 

ZeroMemory(&hints, sizeof(hints)); 
hints.ai_family = AF_INET6; 
hints.ai_socktype = SOCK_DGRAM; 
hints.ai_protocol = IPPROTO_UDP; 

dwRetval = getaddrinfo("ipv6.google.com", NULL, &hints, &result); 
// check your dwRetval here ... 
+0

的让我解决'ipv6.google。 com',但后来'stackoverflow.com'不能解决。我仍然需要解决nslookup如何管理它的问题。 –

+0

我想出了* nslookup如何完成它的任务。它运行一个'A'查询,然后分别进行'AAAA'查找。所以我*有*调用'getaddrinfo'两次,一次用于IPv6,然后再用于IPv4。 –

+1

尝试将'hints.ai_family'设置为'AF_UNSPEC',以允许'getaddrinfo()'同时查询IPv4和IPv6信息。 –