Partager via


Énumérer tous les itinéraires

La procédure suivante décrit les étapes utilisées pour énumérer les entités utilisées par l’API RTMv2. L’exemple de code suivant montre comment énumérer tous les itinéraires.

Le processus de base de chaque énumération est le suivant

  1. Démarrez l’énumération en obtenant un handle auprès du gestionnaire de tables de routage. Appelez RtmCreateDestEnum, RtmCreateRouteEnum et RtmCreateNextHopEnum pour fournir les critères qui spécifient le type d’informations énumérées. Ce critère inclut, mais n’est pas limité à une plage de destinations, à une interface particulière et aux vues dans lesquelles résident les informations.
  2. Appelez RtmGetEnumDests, RtmGetEnumRoutes et RtmGetEnumNextHops une ou plusieurs fois pour récupérer des données jusqu’à ce que le gestionnaire de tables de routage retourne ERROR_NO_MORE_ITEMS. Les données de routage, de destination et de tronçon suivant sont retournées dans l’ordre des informations d’adresse (et les valeurs de préférence et de métrique, si les itinéraires sont énumérés).
  3. Appelez RtmReleaseDests, RtmReleaseRoutes et RtmReleaseNextHops lorsque les handles ou structures d’informations associés à l’énumération ne sont plus nécessaires.
  4. Appelez RtmDeleteEnumHandle pour libérer le handle d’énumération retourné lors de la création de l’énumération. Cette fonction est utilisée pour libérer le handle pour tous les types d’énumérations.

Note

Les itinéraires qui sont dans l’état d’attente sont énumérés uniquement lorsqu’un client demande des données à partir de toutes les vues à l’aide de RTM_VIEW_MASK_ANY.

 

L’exemple de code suivant montre comment énumérer tous les itinéraires de la table de routage.

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