一、获取本机的DNS地址
DNS(Domain Name System 域名系统)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS使用TCP和UDP端口53。当前,对于每一级的域名长度的限制是63个字符,域名总长度则不能超过253个字符。
DNS是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS查询过程如下图所示:
通过函数GetNetworkParams可以获得本机上所有配置好的DNS地址。该函数声明如下:
DWORD GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen);
其中,参数pFixedInfo指向一个缓冲区的指针,该缓冲区包含一个固定的信息结构,该结构接收本地计算机的网络参数(如果函数成功)。调用GetNetWorkParams函数之前,调用方必须分配此缓冲区;pOutBufLen指向一个ULONG变量的指针,该变量指定固定信息结构的大小。如果此大小不足以容纳信息,函数将使用所需大小填充此变量,并且返回错误代码ERROR_BUFFER_OVERFLOW。如果函数成功,返回值为ERROR_SUCCSS。
下面的代码可以获取本机所有的DNS地址:
//获取本机所有DNS地址
void Test5() {
//获取实际大小
DWORD nLength = 0;
if (GetNetworkParams(NULL, &nLength) != ERROR_BUFFER_OVERFLOW) {
std::cerr << "获取本机DNS地址失败!" << std::endl;
return;
}
//分配空间
FIXED_INFO* pFixedInfo = (FIXED_INFO*) new BYTE[nLength];
//获得本地计算机网络参数
if (GetNetworkParams(pFixedInfo, &nLength) != ERROR_SUCCESS) {
std::cerr << "获取本机DNS地址失败!" << std::endl;
delete[]pFixedInfo;
return;
}
//获得本地计算机DNS服务器地址
IP_ADDR_STRING* pCuurentDnsServer = &pFixedInfo->DnsServerList;
while (pCuurentDnsServer != NULL) {
std::cout << "---------------------------------------------" << std::endl;
std::cout << "IpAddressr:" << pCuurentDnsServer->IpAddress.String << std::endl;
std::cout << "IpMask:" << pCuurentDnsServer->IpMask.String << std::endl;
std::cout << "Context:" << pCuurentDnsServer->Context << std::endl;
pCuurentDnsServer = pCuurentDnsServer->Next;
}
}