GetIpForwardTable 関数 (iphlpapi.h)
GetIpForwardTable 関数は、IPv4 ルーティング テーブルを取得します。
構文
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
パラメーター
[out] pIpForwardTable
IPv4 ルーティング テーブルを MIB_IPFORWARDTABLE 構造として受け取るバッファーへのポインター。
[in, out] pdwSize
入力時に、 pIpForwardTable パラメーターによって指されるバッファーのサイズをバイト単位で指定します。
出力時に、バッファーが返されるルーティング テーブルを保持するのに十分な大きさでない場合、関数は、このパラメーターを必要なバッファー サイズ (バイト単位) に設定します。
[in] bOrder
返されるテーブルを並べ替える必要があるかどうかを指定するブール値。 このパラメーターが TRUE の場合、テーブルは次の順序で並べ替えられます。
- 宛先アドレス
- ルートを生成したプロトコル
- マルチパス ルーティング ポリシー
- 次ホップ アドレス
戻り値
関数が成功した場合、戻り値は NO_ERROR (ゼロ) になります。
関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。
リターン コード | 説明 |
---|---|
|
pIpForwardTable パラメーターが指すバッファーの大きさが不十分です。 必要なサイズは、pdwSize パラメーターが指す DWORD 変数で返されます。 |
|
pdwSize パラメーターが NULL であるか、GetIpForwardTable が pdwSize パラメーターによって指すメモリに書き込むことができません。 |
|
使用できるデータはありません。 このエラーは、ローカル コンピューターにルートが存在しない場合に返されます。 |
|
この関数は、ローカル システムで使用されているオペレーティング システムではサポートされていません。 このエラーは、ローカル コンピューターに IP スタックがインストールされていない場合に返されます。 |
|
FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。 |
解説
MIB_IPFORWARDROW構造体の dwForwardProto メンバーは、ルートを生成したプロトコルまたはルーティング メカニズムを指定します。 使用可能なプロトコルとルーティング メカニズムの一覧については、「プロトコル 識別子」を 参照してください。
MIB_IPFORWARDROW構造体の dwForwardDest、dwForwardMask、dwForwardNextHop メンバーは、ネットワーク バイト順の IPv4 アドレスを表します。
MIB_IPFORWARDROW構造体の dwForwardDest メンバーの IPv4 アドレス 0.0.0.0 は、既定のルートと見なされます。 複数のネットワーク アダプターがインストールされている場合、MIB_IPFORWARDTABLEには dwForwardDest メンバーが 0.0.0.0 に設定された複数のMIB_IPFORWARDROW エントリが含まれる場合があります。
dwForwardAge が INFINITE に設定されている場合、タイムアウトに基づいてルートは削除されません
値を表します。 dwForwardAge のその他の値は、ネットワーク ルーティング テーブルでルートが追加または変更されてからの秒数を指定します。
ルーティングおよびリモート アクセス サービス (RRAS) が実行されている Windows Server 2003 または Windows 2000 Server では、返される MIB_IPFORWARDROW エントリには dwForwardType メンバーと dwForwardAge メンバーが 0 に設定されます。
Windows Vista および Windows Server 2008 では、MIB_IPFORWARDROW構造体の dwForwardMetric1 メンバーで指定されたルート メトリックは、関連付けられたインターフェイスのMIB_IPINTERFACE_ROW構造の Metric メンバーで指定されたインターフェイス メトリックに追加されたルート メトリックの組み合わせを表します。 そのため、MIB_IPFORWARDROW構造体の dwForwardMetric1 メンバーは、関連付けられているMIB_IPINTERFACE_ROW構造体の Metric メンバー以上である必要があります。 Windows Vista および Windows Server 2008 でアプリケーションでルート メトリックを 0 に設定する場合、MIB_IPFORWARDROW構造体の dwForwardMetric1 メンバーは、関連付けられているMIB_IPINTERFACE_ROW構造体の Metric メンバーで指定されたインターフェイス メトリックの値と等しく設定する必要があります。 アプリケーションは、 GetIpInterfaceEntry 関数を呼び出すことによってインターフェイス メトリックを取得できます。
GetIpForwardTable によって返されるMIB_IPFORWARDROW構造体エントリのメンバーの数は、現在、IPv4 ルーティングでは使用されていません。 これらのメンバーには、 dwForwardPolicy、 dwForwardNextHopAS、 dwForwardMetric2、 dwForwardMetric3、 dwForwardMetric4、 dwForwardMetric5 が含まれます。
例
次の例では、IP ルーティング テーブルを取得し、テーブル内の各ルートの一部のフィールドを出力します。
// Need to link with Ws2_32.lib and Iphlpapi.lib
#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 main()
{
// Declare and initialize variables.
/* variables used for GetIfForwardTable */
PMIB_IPFORWARDTABLE pIpForwardTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
struct in_addr IpAddr;
int i;
pIpForwardTable =
(MIB_IPFORWARDTABLE *) MALLOC(sizeof (MIB_IPFORWARDTABLE));
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pIpForwardTable);
pIpForwardTable = (MIB_IPFORWARDTABLE *) MALLOC(dwSize);
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
}
/* Note that the IPv4 addresses returned in
* GetIpForwardTable entries are in network byte order
*/
if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
printf("\tNumber of entries: %d\n",
(int) pIpForwardTable->dwNumEntries);
for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
/* Convert IPv4 addresses to strings */
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardDest;
strcpy_s(szDestIp, sizeof (szDestIp), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardMask;
strcpy_s(szMaskIp, sizeof (szMaskIp), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardNextHop;
strcpy_s(szGatewayIp, sizeof (szGatewayIp), inet_ntoa(IpAddr));
printf("\n\tRoute[%d] Dest IP: %s\n", i, szDestIp);
printf("\tRoute[%d] Subnet Mask: %s\n", i, szMaskIp);
printf("\tRoute[%d] Next Hop: %s\n", i, szGatewayIp);
printf("\tRoute[%d] If Index: %ld\n", i,
pIpForwardTable->table[i].dwForwardIfIndex);
printf("\tRoute[%d] Type: %ld - ", i,
pIpForwardTable->table[i].dwForwardType);
switch (pIpForwardTable->table[i].dwForwardType) {
case MIB_IPROUTE_TYPE_OTHER:
printf("other\n");
break;
case MIB_IPROUTE_TYPE_INVALID:
printf("invalid route\n");
break;
case MIB_IPROUTE_TYPE_DIRECT:
printf("local route where next hop is final destination\n");
break;
case MIB_IPROUTE_TYPE_INDIRECT:
printf
("remote route where next hop is not final destination\n");
break;
default:
printf("UNKNOWN Type value\n");
break;
}
printf("\tRoute[%d] Proto: %ld - ", i,
pIpForwardTable->table[i].dwForwardProto);
switch (pIpForwardTable->table[i].dwForwardProto) {
case MIB_IPPROTO_OTHER:
printf("other\n");
break;
case MIB_IPPROTO_LOCAL:
printf("local interface\n");
break;
case MIB_IPPROTO_NETMGMT:
printf("static route set through network management \n");
break;
case MIB_IPPROTO_ICMP:
printf("result of ICMP redirect\n");
break;
case MIB_IPPROTO_EGP:
printf("Exterior Gateway Protocol (EGP)\n");
break;
case MIB_IPPROTO_GGP:
printf("Gateway-to-Gateway Protocol (GGP)\n");
break;
case MIB_IPPROTO_HELLO:
printf("Hello protocol\n");
break;
case MIB_IPPROTO_RIP:
printf("Routing Information Protocol (RIP)\n");
break;
case MIB_IPPROTO_IS_IS:
printf
("Intermediate System-to-Intermediate System (IS-IS) protocol\n");
break;
case MIB_IPPROTO_ES_IS:
printf("End System-to-Intermediate System (ES-IS) protocol\n");
break;
case MIB_IPPROTO_CISCO:
printf("Cisco Interior Gateway Routing Protocol (IGRP)\n");
break;
case MIB_IPPROTO_BBN:
printf("BBN Internet Gateway Protocol (IGP) using SPF\n");
break;
case MIB_IPPROTO_OSPF:
printf("Open Shortest Path First (OSPF) protocol\n");
break;
case MIB_IPPROTO_BGP:
printf("Border Gateway Protocol (BGP)\n");
break;
case MIB_IPPROTO_NT_AUTOSTATIC:
printf("special Windows auto static route\n");
break;
case MIB_IPPROTO_NT_STATIC:
printf("special Windows static route\n");
break;
case MIB_IPPROTO_NT_STATIC_NON_DOD:
printf
("special Windows static route not based on Internet standards\n");
break;
default:
printf("UNKNOWN Proto value\n");
break;
}
printf("\tRoute[%d] Age: %ld\n", i,
pIpForwardTable->table[i].dwForwardAge);
printf("\tRoute[%d] Metric1: %ld\n", i,
pIpForwardTable->table[i].dwForwardMetric1);
}
FREE(pIpForwardTable);
return 0;
} else {
printf("\tGetIpForwardTable failed.\n");
FREE(pIpForwardTable);
return 1;
}
}
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | iphlpapi.h |
Library | Iphlpapi.lib |
[DLL] | Iphlpapi.dll |