GetIpAddrTable 関数 (iphlpapi.h)
GetIpAddrTable 関数は、インターフェイスから IPv4 へのアドレス マッピング テーブルを取得します。
構文
IPHLPAPI_DLL_LINKAGE DWORD GetIpAddrTable(
[out] PMIB_IPADDRTABLE pIpAddrTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
パラメーター
[out] pIpAddrTable
インターフェイスから IPv4 へのアドレス マッピング テーブルを MIB_IPADDRTABLE 構造として受け取るバッファーへのポインター。
[in, out] pdwSize
入力時に、 pIpAddrTable パラメーターによって指されるバッファーのサイズをバイト単位で指定します。
出力時に、バッファーが、返されるマッピング テーブルを保持するのに十分な大きさでない場合、関数は、このパラメーターを必要なバッファー サイズ (バイト単位) に設定します。
[in] bOrder
このパラメーターが TRUE の場合、返されるマッピング テーブルは IPv4 アドレスの昇順で並べ替えられます。 並べ替えは、ネットワークのバイト順で実行されます。 たとえば、10.0.0.255 は 10.0.1.0 の直前に来ます。
戻り値
関数が成功した場合、戻り値はNO_ERROR。
関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。
リターン コード | 説明 |
---|---|
|
pIpAddrTable パラメーターが指すバッファーの大きさが十分ではありません。 必要なサイズは、pdwSize パラメーターが指す DWORD 変数で返されます。 |
|
pdwSize パラメーターが NULL であるか、GetIpAddrTable が pdwSize パラメーターが指すメモリに書き込むことができません。 |
|
この関数は、ローカル システムで使用されているオペレーティング システムではサポートされていません。 |
|
FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。 |
解説
GetIpAddrTable 関数は、ローカル コンピューター上のインターフェイスから IPv4 へのアドレス マッピング テーブルを取得し、この情報をMIB_IPADDRTABLE構造で返します。
GetIpAddrTable 関数によって返される IPv4 アドレスは、ローカル コンピューター上のネットワーク インターフェイスの状態の影響を受けます。 ネットワーク インターフェイス カード (NIC) と特定の PnP イベントを手動でリセットすると、IP アドレスが削除または変更される可能性があります。
Windows Server 2003 および Windows XP では、ローカル コンピューター上の TCP/IP スタックのメディア 検出機能が DisableMediaSense 関数を呼び出して無効になっている場合、GetIpAddrTable 関数によって返される IPv4 アドレスも影響を受けます。 メディア センシングが無効になっている場合、 GetIpAddrTable 関数は、切断されたインターフェイスに関連付けられている IPv4 アドレスを返す場合があります。 切断されたインターフェイスのこれらの Ipv4 アドレスは、使用できません。
Windows Server 2008 および Windows Vista では、 GetIpAddrTable 関数によって返される IPv4 アドレスは、ローカル コンピューター上の TCP/IP スタックのメディア 検出機能の影響を受けません。 GetIpAddrTable 関数は、有効な IPv4 アドレスのみを返します。
Windows XP で使用できる GetAdaptersAddresses 関数を使用すると、IPv6 アドレスと IPv4 アドレスとインターフェイス情報の両方を取得できます。
GetIpAddrTable 関数によって返されるMIB_IPADDRTABLE構造体には、dwNumEntries メンバーとテーブル メンバー内の最初のMIB_IPADDRROW配列エントリとの間の配置のためのパディングが含まれている場合があります。 配置のパディングは、テーブル メンバー内のMIB_IPADDRROW配列エントリ間に存在する場合もあります。 MIB_IPADDRROW配列エントリへのアクセスは、パディングが存在する可能性があることを前提とする必要があります。
Windows Vista 以降用にリリースされた Microsoft Windows ソフトウェア開発キット (SDK) では、ヘッダー ファイルのorganizationが変更され、MIB_IPADDRROWは Iprtrmib.h ヘッダー ファイルではなく Ipmib.h ヘッダー ファイルで定義されます。 Ipmib.h ヘッダー ファイルは、Iphlpapi.h ヘッダー ファイルに自動的に含まれる Iprtrmib.h に自動的に含まれることに注意してください。 Ipmib.h および Iprtrmib.h ヘッダー ファイルを直接使用しないでください。
例
次の例では、IP アドレス テーブルを取得し、そのテーブル内の IP アドレス エントリの一部のメンバーを出力します。
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int __cdecl main()
{
int i;
/* Variables used by GetIpAddrTable */
PMIB_IPADDRTABLE pIPAddrTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
IN_ADDR IPAddr;
/* Variables used to return error message */
LPVOID lpMsgBuf;
// Before calling AddIPAddress we use GetIpAddrTable to get
// an adapter to which we can add the IP.
pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));
if (pIPAddrTable) {
// Make an initial call to GetIpAddrTable to get the
// necessary size into the dwSize variable
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pIPAddrTable);
pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);
}
if (pIPAddrTable == NULL) {
printf("Memory allocation failed for GetIpAddrTable\n");
exit(1);
}
}
// Make a second call to GetIpAddrTable to get the
// actual data we want
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
printf("GetIpAddrTable failed with error %d\n", dwRetVal);
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) & lpMsgBuf, 0, NULL)) {
printf("\tError: %s", lpMsgBuf);
LocalFree(lpMsgBuf);
}
exit(1);
}
printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
printf("\tSubnet Mask[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
printf("\tBroadCast[%d]: \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
printf("\tType and State[%d]:", i);
if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
printf("\tPrimary IP Address");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
printf("\tDynamic IP Address");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
printf("\tAddress is on disconnected interface");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
printf("\tAddress is being deleted");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
printf("\tTransient address");
printf("\n");
}
if (pIPAddrTable) {
FREE(pIPAddrTable);
pIPAddrTable = NULL;
}
exit(0);
}
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | iphlpapi.h |
Library | Iphlpapi.lib |
[DLL] | Iphlpapi.dll |