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 の場合、テーブルは次の順序で並べ替えられます。

  1. 宛先アドレス
  2. ルートを生成したプロトコル
  3. マルチパス ルーティング ポリシー
  4. 次ホップ アドレス

戻り値

関数が成功した場合、戻り値は NO_ERROR (ゼロ) になります。

関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。

リターン コード 説明
ERROR_INSUFFICIENT_BUFFER
pIpForwardTable パラメーターが指すバッファーの大きさが不十分です。 必要なサイズは、pdwSize パラメーターが指す DWORD 変数で返されます。
ERROR_INVALID_PARAMETER
pdwSize パラメーターが NULL であるか、GetIpForwardTablepdwSize パラメーターによって指すメモリに書き込むことができません。
ERROR_NO_DATA
使用できるデータはありません。 このエラーは、ローカル コンピューターにルートが存在しない場合に返されます。
ERROR_NOT_SUPPORTED
この関数は、ローカル システムで使用されているオペレーティング システムではサポートされていません。 このエラーは、ローカル コンピューターに IP スタックがインストールされていない場合に返されます。
その他
FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。

解説

MIB_IPFORWARDROW構造体の dwForwardProto メンバーは、ルートを生成したプロトコルまたはルーティング メカニズムを指定します。 使用可能なプロトコルとルーティング メカニズムの一覧については、「プロトコル 識別子」を 参照してください。

MIB_IPFORWARDROW構造体の dwForwardDestdwForwardMaskdwForwardNextHop メンバーは、ネットワーク バイト順の IPv4 アドレスを表します。

MIB_IPFORWARDROW構造体の dwForwardDest メンバーの IPv4 アドレス 0.0.0.0 は、既定のルートと見なされます。 複数のネットワーク アダプターがインストールされている場合、MIB_IPFORWARDTABLEには dwForwardDest メンバーが 0.0.0.0 に設定された複数のMIB_IPFORWARDROW エントリが含まれる場合があります。

dwForwardAgeINFINITE に設定されている場合、タイムアウトに基づいてルートは削除されません

値を表します。 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 ルーティングでは使用されていません。 これらのメンバーには、 dwForwardPolicydwForwardNextHopASdwForwardMetric2dwForwardMetric3dwForwardMetric4dwForwardMetric5 が含まれます。

次の例では、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

関連項目

CreateIpForwardEntry

DeleteIpForwardEntry

GetIpInterfaceEntry

IP ヘルパー関数リファレンス

IP ヘルパーの開始ページ

MIB_IPFORWARDTABLE

MIB_IPINTERFACE_ROW

プロトコル識別子

SetIpForwardEntry