Compartir a través de


Enumerar todas las rutas

En el procedimiento siguiente se describen los pasos que se usan para enumerar cualquiera de las entidades usadas por la API RTMv2. El código de ejemplo siguiente muestra cómo enumerar todas las rutas.

El proceso básico para cada enumeración es el siguiente

  1. Inicie la enumeración obteniendo un identificador del administrador de tablas de enrutamiento. Llame a RtmCreateDestEnum, RtmCreateRouteEnum y RtmCreateNextHopEnum para proporcionar los criterios que especifican el tipo de información que se enumera. Estos criterios incluyen, pero no se limita a una variedad de destinos, una interfaz determinada y las vistas en las que reside la información.
  2. Llame a RtmGetEnumDests, RtmGetEnumRoutes y RtmGetEnumNextHops una o varias veces para recuperar datos hasta que el administrador de tablas de enrutamiento devuelva ERROR_NO_MORE_ITEMS. Los datos de ruta, destino y próximo salto se devuelven en orden de la información de dirección (y los valores de preferencias y métricas, si se enumeran las rutas).
  3. Llame a RtmReleaseDests, RtmReleaseRoutes y RtmReleaseNextHops cuando los identificadores o las estructuras de información asociadas a la enumeración ya no son necesarios.
  4. Llame a RtmDeleteEnumHandle para liberar el identificador de enumeración que se devolvió cuando se creó la enumeración. Esta función se usa para liberar el identificador de todos los tipos de enumeraciones.

Nota

Las rutas que están en estado de suspensión solo se enumeran cuando un cliente solicita datos de todas las vistas mediante RTM_VIEW_MASK_ANY.

 

En el código de ejemplo siguiente se muestra cómo enumerar todas las rutas de la tabla de enrutamiento.

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