当我使用此代码时 请参考此处: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? 任何建议将不胜感激:)
答案 0 :(得分:1)
我发现了问题。
对于那些导致invlid地址的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);
}
答案 1 :(得分: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;
非常感谢您分享此信息,但我想添加此信息以进一步阐明;
即使您将某些FQDN的DNS_TYPE_A作为wType调用DNSQuery_A,它仍可能会为您返回wType的记录(0x5)DNS_TYPE_CNAME。
在这种情况下,您可以通过检查QueryResults的实际CNAME部分找到实际的主机名,然后再次为新的主机名调用DNSQuery_A()API。检查上面的代码段