枚举所有路由

以下过程概述了用于枚举 RTMv2 API 使用的任何实体的步骤。 下面的示例代码演示如何枚举所有路由。

每个枚举的基本过程如下所示

  1. 通过从路由表管理器获取句柄来启动枚举。 调用 RtmCreateDestEnumRtmCreateRouteEnumRtmCreateNextHopEnum 以提供指定要枚举的信息类型的条件。 此条件包括但不限于一系列目标、特定接口和信息所在的视图。
  2. 调用 RtmGetEnumDestsRtmGetEnumRoutesRtmGetEnumNextHops 一次或多次检索数据,直到路由表管理器返回ERROR_NO_MORE_ITEMS。 如果) 枚举路由,则按地址信息 (以及首选项和指标值的顺序返回路由、目标和下一跃点数据。
  3. 当不再需要与枚举关联的句柄或信息结构时,调用 RtmReleaseDests、RtmReleaseRoutes 和 RtmReleaseNextHops
  4. 调用 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);
}