Visual C++ 2017网络编程实战
上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来对比确认。