すべてのルートを列挙する
次の手順では、RTMv2 API で使用されるエンティティを列挙するために使用される手順の概要を示します。 次のサンプル コードは、すべてのルートを列挙する方法を示しています。
各列挙の基本的なプロセスは次のとおりです。
- ルーティング テーブル マネージャーからハンドルを取得して、列挙を開始します。 RtmCreateDestEnum、RtmCreateRouteEnum、RtmCreateNextHopEnum を呼び出して、列挙する情報の種類を指定する条件を指定します。 この条件には、宛先の範囲、特定のインターフェイス、および情報が存在するビューが含まれますが、これらに限定されません。
- ルーティング テーブル マネージャーがERROR_NO_MORE_ITEMSを返すまで、 RtmGetEnumDests、 RtmGetEnumRoutes 、 RtmGetEnumNextHops を 1 回以上呼び出してデータを取得します。 ルート、宛先、およびネクスト ホップのデータは、アドレス情報 (およびルートが列挙されている場合は優先順位とメトリック値) の順序で返されます。
- 列挙に関連付けられているハンドルまたは情報構造体が不要になった場合は、 RtmReleaseDests、 RtmReleaseRoutes 、 RtmReleaseNextHops を呼び出します。
- 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);
}