DNSの情報を取得する

コンピュータのホスト名や現在使っているDNSに関する情報を取得するには、GetNetworkParams()関数を利用します。

サンプルコード

GetNetworkParams()を使ったサンプルコードを以下に示します。


#include <stdio.h>

#include <winsock2.h>
#include <iphlpapi.h>

int
main()
{
 FIXED_INFO *FixedInfo = NULL;
 ULONG    ulOutBufLen = 0;
 DWORD    dwRetVal;
 IP_ADDR_STRING *pIPAddr;
   
 if(GetNetworkParams(NULL, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
   FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, ulOutBufLen);
 } else {
   return 1;
 }

 if (dwRetVal = GetNetworkParams(FixedInfo, &ulOutBufLen)) {
   printf("GetNetworkParams() failed: %08x\n", dwRetVal);
   return 1;
 } else {
   printf("Host Name: %s\n", FixedInfo->HostName);
   printf("Domain Name: %s\n", FixedInfo->DomainName);

   printf("DNS Servers:\n" );
   printf("\t%s\n", FixedInfo->DnsServerList.IpAddress.String);
      
   pIPAddr = FixedInfo->DnsServerList.Next;
   while (pIPAddr ) {
     printf("\t%s\n", pIPAddr->IpAddress.String);
     pIPAddr = pIPAddr->Next;
   }
 }

 return 0;
}

サンプルコード実行例

上記コードをコンパイルして出来たものを実行すると、以下のようになります。


C:> a.exe
Host Name: GeekPC
Domain Name:
DNS Server:
      192.168.0.1

GetNetworkParams()が利用する構造体

GetNetworkParams()が利用しているFIXED_INFOは以下のように宣言されています。


typedef struct {
  char HostName[MAX_HOSTNAME_LEN + 4];
  char DomainName[MAX_DOMAIN_NAME_LEN + 4];
  PIP_ADDR_STRING CurrentDnsServer;
  IP_ADDR_STRING DnsServerList;
  UINT NodeType;
  char ScopeId[MAX_SCOPE_ID_LEN + 4];
  UINT EnableRouting;
  UINT EnableProxy;
  UINT EnableDns;
} FIXED_INFO, *PFIXED_INFO;

HostName ローカルコンピュータのホスト名です。
DomainName ローカルコンピュータが登録されているドメイン名です。
CurrentDnsServer 使われていません。DnsServerListを使うようです。
DnsServerList ローカルコンピュータが使っているDNSサーバのリスト。Linked Listにより表現されています。
NodeType ローカルコンピュータのノードタイプ。次の4つの値があります。BROADCAST_NODETYPE、PEER_TO_PEER_NODETYPE、MIXED_NODETYPE、HYBRID_NODETYPE
ScopeId DHCP scope name。
EnableRouting ルーティングがEnabledされているかを表します。
EnableProxy ARP Proxyとしてサービスを提供しているかを表します。
EnableDns DNSを行なっているかを表します。

YouTubeチャンネルやってます!