Поделиться через


Перечисление всех маршрутов

В следующей процедуре описаны шаги, используемые для перечисления любых сущностей, используемых API RTMv2. В следующем примере кода показано, как перечислить все маршруты.

Базовый процесс для каждого перечисления выглядит следующим образом:

  1. Начните перечисление с получения дескриптора из диспетчера таблиц маршрутизации. Вызовите rtmCreateDestEnum, RtmCreateRouteEnum и RtmCreateNextHopEnum , чтобы указать критерии, определяющие тип перечисляемой информации. Эти критерии включают, но не ограничиваются диапазоном назначений, определенным интерфейсом и представлениями, в которых находится информация.
  2. Вызовите rtmGetEnumDests, RtmGetEnumRoutes и RtmGetEnumNextHops один или несколько раз, чтобы получить данные, пока диспетчер таблиц маршрутизации не вернет 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);
}