3

当我在这里使用此代码参考时:http: //support.microsoft.com/kb/831226

我可以编译成功,但是当我用它做一些 dns 查询时,返回地址很奇怪,例如:176.20.31.0(这不应该是一个有效的地址)

这是我的输出:

C:\dnsq\Debug>dnsq.exe -n tw.media.blizzard.com -t A -s 8.8.8.8
The IP address of the host tw.media.blizzard.com is 176.20.31.0

但实际上 tw.media.blizzard.com 应该是:(我通过 nslookup 查询)

# nslookup tw.media.blizzard.com 8.8.8.8
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
tw.media.blizzard.com   canonical name = tw.media.blizzard.com.edgesuite.net.
tw.media.blizzard.com.edgesuite.net     canonical name = a1479.g.akamai.net.
Name:   a1479.g.akamai.net
Address: 23.14.93.167
Name:   a1479.g.akamai.net
Address: 23.14.93.157

我的问题是为什么 dnsquery 在某些 FQDN 上不起作用?任何建议将不胜感激:)

4

2 回答 2

1

我发现了问题。

对于那些导致地址无效的 FQDN,常见的是它们的 DNS 记录类型都是“DNS_TYPE_CNAME”,而不是 DNS_TYPE_A。

所以我们需要解析整个 PDNS_RECORD 来获取 DNS_TYPE_A 信息。


我将在这里发布我的更改:

来自MS的原始代码:

    if(wType == DNS_TYPE_A) {
        //convert the Internet network address into a string
        //in Internet standard dotted format.
        ipaddr.S_un.S_addr = (pDnsRecord->Data.A.IpAddress);
        printf("The IP address of the host %s is %s \n", pOwnerName,inet_ntoa(ipaddr));

        // Free memory allocated for DNS records. 
        DnsRecordListFree(pDnsRecord, freetype);
    }

我在这里的改变:

    if(wType == DNS_TYPE_A) {
        //convert the Internet network address into a string
        //in Internet standard dotted format.
        PDNS_RECORD cursor;

        for (cursor = pDnsRecord; cursor != NULL; cursor = cursor->pNext) {
            if (cursor->wType == DNS_TYPE_A) {
                ipaddr.S_un.S_addr = (cursor->Data.A.IpAddress);
                printf("The IP address of the host %s is %s \n", pOwnerName,inet_ntoa(ipaddr));                 
            }
        }

        // Free memory allocated for DNS records. 
        DnsRecordListFree(pDnsRecord, freetype);
    }       
于 2012-12-13T03:51:20.210 回答
0
PDNS_RECORD pQueryResults;

DNS_STATUS dResult = DnsQuery_A(
        "www.facebook.com",
        DNS_TYPE_A,
        DNS_QUERY_WIRE_ONLY, 
        NULL,
        (PDNS_RECORD*)&pQueryResults,
        NULL
    );

char* szActualHost = (char*) pQueryResults->Data.CNAME.pNameHost;

非常感谢分享这个,但我想添加这个以进一步澄清;

  • 即使您使用 DNS_TYPE_A 作为某些 FQDN 的 wType 调用 DNSQuery_A,它仍可能会返回您的 wType 记录为 (0x5) DNS_TYPE_CNAME。

  • 在这种情况下,您可以通过检查 QueryResults 的实际 CNAME 部分来找到实际的主机名,当然也可以再次调用 DNSQuery_A() API 来获取新的主机名。检查上面的代码片段

于 2018-10-09T05:58:55.757 回答