枚举所有路由
以下过程概述了用于枚举 RTMv2 API 使用的任何实体的步骤。 下面的示例代码演示如何枚举所有路由。
每个枚举的基本过程如下所示
- 通过从路由表管理器获取句柄来启动枚举。 调用 RtmCreateDestEnum、 RtmCreateRouteEnum 和 RtmCreateNextHopEnum 以提供指定要枚举的信息类型的条件。 此条件包括但不限于一系列目标、特定接口和信息所在的视图。
- 调用 RtmGetEnumDests、 RtmGetEnumRoutes 和 RtmGetEnumNextHops 一次或多次检索数据,直到路由表管理器返回ERROR_NO_MORE_ITEMS。 如果) 枚举路由,则按地址信息 (以及首选项和指标值的顺序返回路由、目标和下一跃点数据。
- 当不再需要与枚举关联的句柄或信息结构时,调用 RtmReleaseDests、RtmReleaseRoutes 和 RtmReleaseNextHops。
- 调用 RtmDeleteEnumHandle 以释放创建枚举时返回的枚举句柄。 此函数用于释放所有类型的枚举的句柄。
注意
仅当客户端使用 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);
}