上QQ阅读APP看书,第一时间看更新
2.6 获取本机的DNS地址
DNS(Domain Name System,域名系统)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
DNS是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS查询过程如图2-9所示。
图2-9
通过函数GetNetworkParams可以获得本机上所有配置好的DNS地址。该函数声明如下:
DWORD GetNetworkParams(PFIXED_INFO pFixedInfo,PULONG pOutBufLen);
其中,参数pFixedInfo指向一个缓冲区的指针,该缓冲区包含一个固定的信息结构,该结构接收本地计算机的网络参数(如果函数成功),调用GetNetworkParams函数之前,调用方必须分配此缓冲区;pOutBufLen指向一个ULONG变量的指针,该变量指定固定信息结构的大小。如果此大小不足以容纳信息,函数将使用所需大小填充此变量,并返回错误代码ERROR_BUFFER_OVERFLOW。如果函数成功,返回值为ERROR_SUCCESS;如果函数失败,将返回错误代码。
【例2.6】获取本机所有DNS地址
(1)新建一个控制台工程test。
(2)在test.cpp中输入代码如下:
#include "stdafx.h" #include <windows.h> #include <Iphlpapi.h> #pragma comment(lib,"IPHlpApi.lib") int main() { DWORD nLength = 0; //先获取实际大小,并存入nLength if (GetNetworkParams(NULL, &nLength) != ERROR_BUFFER_OVERFLOW) { return -1; } //根据实际所需大小,分配空间 FIXED_INFO* pFixedInfo = (FIXED_INFO*)new BYTE[nLength]; //获得本地计算机网络参数 if (GetNetworkParams(pFixedInfo, &nLength) != ERROR_SUCCESS) { delete[] pFixedInfo; return -1; } //获得本地计算机DNS服务器地址 char strText[500] = "本地计算机的DNS地址:\n"; IP_ADDR_STRING* pCurrentDnsServer = &pFixedInfo->DnsServerList; while (pCurrentDnsServer != NULL) { char strTemp[100] = ""; sprintf(strTemp, "%s\n", pCurrentDnsServer->IpAddress.String); strcat(strText, strTemp); pCurrentDnsServer = pCurrentDnsServer->Next; } puts(strText); delete[] pFixedInfo; return 0; }
(3)保存工程并运行,运行结果如图2-10所示。
图2-10
此时大家可以通过ipconfig/all来对比确认。