[Windows] PCのIPアドレス情報を得る

Windows上でIPアドレスを知る方法はいくつかある。たまたまCで実装する必要があったので、GetIpAddrTableを使用することにした。
msdnの説明ページは以下に。
GetIpAddrTable Function
上記のmsdnに掲載されているC言語のプログラムを実行すると、インターフェースとしてlocalhost(127.0.0.1)もリストに上がる。
ヘッダファイルはXPでもソースコード例のままでよいようだ。

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

実際にアドレス情報を取得する前に、テーブルサイズを問い合わせる手順が必要であること。

pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));
if (pIPAddrTable) {
    // dwSizeには以下の呼び出し後に必要なサイズが入る
    if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
    ERROR_INSUFFICIENT_BUFFER) {
    FREE(pIPAddrTable);
    // dwSizeの値を使い、必要な領域をmallocする。
    pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);
}

ソースコード例ではHeapALLOCを使用しているが 手元ではmallocでも動作した。
テーブルを確保した後で初めて情報を取得できる。

if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
   // エラー処理
}
   // これ以降では取得した値を使用できる。
printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
for (i=0; i < dwNumEntries; i++) {
   printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
   //
}

127/8のアドレスのときに実際の値をプリントさせてみたところ、
htonlを経由しない出力は以下の画像の四角で囲んだようになり、戻ってくる値は host orderになっていることがわかる。したがって、用途によっては htonlなどの関数でnetwork order (big endian)に変換する必要がある。

プログラムからの出力

広告
%d人のブロガーが「いいね」をつけました。