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を行なっているかを表します。 |