次の方法で共有


すべてのルートを列挙する

次の手順では、RTMv2 API で使用されるエンティティを列挙するために使用される手順の概要を示します。 次のサンプル コードは、すべてのルートを列挙する方法を示しています。

各列挙の基本的なプロセスは次のとおりです。

  1. ルーティング テーブル マネージャーからハンドルを取得して、列挙を開始します。 RtmCreateDestEnumRtmCreateRouteEnumRtmCreateNextHopEnum を呼び出して、列挙する情報の種類を指定する条件を指定します。 この条件には、宛先の範囲、特定のインターフェイス、および情報が存在するビューが含まれますが、これらに限定されません。
  2. ルーティング テーブル マネージャーがERROR_NO_MORE_ITEMSを返すまで、 RtmGetEnumDestsRtmGetEnumRoutesRtmGetEnumNextHops を 1 回以上呼び出してデータを取得します。 ルート、宛先、およびネクスト ホップのデータは、アドレス情報 (およびルートが列挙されている場合は優先順位とメトリック値) の順序で返されます。
  3. 列挙に関連付けられているハンドルまたは情報構造体が不要になった場合は、 RtmReleaseDestsRtmReleaseRoutesRtmReleaseNextHops を呼び出します。
  4. RtmDeleteEnumHandle を呼び出して、列挙の作成時に返された列挙ハンドルを解放します。 この関数は、すべての種類の列挙のハンドルを解放するために使用されます。

Note

保留状態のルートは、クライアントが RTM_VIEW_MASK_ANY を使用してすべてのビューからデータを要求した場合にのみ列挙されます。

 

次のサンプル コードは、ルーティング テーブル内のすべてのルートを列挙する方法を示しています。

MaxHandles = RegnProfile.MaxHandlesInEnum;

RouteHandles = _alloca(MaxHandles * sizeof(HANDLE));

// Do a "route enumeration" over the whole table
// by passing a NULL DestHandle in this function.

DestHandle = NULL; // Give a valid handle to enumerate over a particular destination

Status = RtmCreateRouteEnum(RtmRegHandle,
                            DestHandle,
                            RTM_VIEW_MASK_UCAST|RTM_VIEW_MASK_MCAST,
                            RTM_ENUM_OWN_ROUTES, // Get only your own routes
                            NULL,
                            0,
                            NULL,
                            0,
                            &EnumHandle2);
if (Status == NO_ERROR)
{
    do
    {
        NumHandles = MaxHandles;

        Status = RtmGetEnumRoutes(RtmRegHandle
                                  EnumHandle2,
                                  &NumHandles,
                                  RouteHandles);

        for (k = 0; k < NumHandles; k++)
        {
            wprintf("Route %d: %p\n", l++, RouteHandles[k]);

            // Get route information using the route's handle
            Status = RtmGetRouteInfo(...RouteHandles[k]...);

            if (Status == NO_ERROR)
            {
                // Do whatever you want with the route info
                //...

                // Release the route information once you are done
                RtmReleaseRouteInfo(...);
            }
        }

        RtmReleaseRoutes(RtmRegHandle, NumHandles, RouteHandles);
    }
    while (Status == NO_ERROR)

    // Close the enumeration and release its resources
    RtmDeleteEnumHandle(RtmRegHandle, EnumHandle2);
}