Partilhar via


Enumerar Todas as Rotas

O procedimento a seguir descreve as etapas usadas para enumerar qualquer uma das entidades usadas pela API RTMv2. O código de exemplo a seguir mostra como enumerar todas as rotas.

O processo básico para cada enumeração é o seguinte

  1. Inicie a enumeração obtendo um identificador do gerenciador de tabelas de roteamento. Chame RtmCreateDestEnum, RtmCreateRouteEnum e RtmCreateNextHopEnum para fornecer os critérios que especificam o tipo de informação que está sendo enumerada. Esses critérios incluem, mas não se limita a uma variedade de destinos, uma interface específica e as exibições nas quais as informações residem.
  2. Chame RtmGetEnumDests, RtmGetEnumRoutes e RtmGetEnumNextHops uma ou mais vezes para recuperar dados até que o gerenciador de tabelas de roteamento retorne ERROR_NO_MORE_ITEMS. Os dados de rota, destino e próximo salto são retornados na ordem das informações de endereço (e os valores de preferência e métrica, se as rotas estiverem sendo enumeradas).
  3. Chame RtmReleaseDests, RtmReleaseRoutes e RtmReleaseNextHops quando os identificadores ou estruturas de informações associados à enumeração não forem mais necessários.
  4. Chame RtmDeleteEnumHandle para liberar o identificador de enumeração que foi retornado quando a enumeração foi criada. Essa função é usada para liberar o identificador para todos os tipos de enumerações.

Observação

As rotas que estão no estado de retenção só são enumeradas quando um cliente solicita dados de todas as exibições usando RTM_VIEW_MASK_ANY.

 

O código de exemplo a seguir mostra como enumerar todas as rotas na tabela de roteamento.

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);
}