Énumérer toutes les routes
La procédure suivante décrit les étapes utilisées pour énumérer l’une des entités utilisées par l’API RTMv2. L’exemple de code qui suit montre comment énumérer tous les itinéraires.
Le processus de base pour chaque énumération est le suivant :
- Démarrez l’énumération en obtenant un handle à partir 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, sans s’y limiter, une plage de destinations, une interface particulière et les vues dans lesquelles se trouvent les informations.
- Appelez RtmGetEnumDests, RtmGetEnumRoutes et RtmGetEnumNextHops une ou plusieurs fois pour récupérer des données jusqu’à ce que le gestionnaire de table de routage retourne ERROR_NO_MORE_ITEMS. Les données d’itinéraire, de destination et de tronçon suivant sont retournées dans l’ordre des informations d’adresse (ainsi que les valeurs de préférence et de métrique, si les itinéraires sont énumérés).
- Appelez RtmReleaseDests, RtmReleaseRoutes et RtmReleaseNextHops lorsque les handles ou les structures d’informations associées à l’énumération ne sont plus nécessaires.
- Appelez RtmDeleteEnumHandle pour libérer le handle d’énumération qui a été 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.
Notes
Les itinéraires qui sont à l’état de conservation ne sont énumérés que lorsqu’un client demande des données de toutes les vues à l’aide de RTM_VIEW_MASK_ANY.
L’exemple de code suivant montre comment énumérer tous les itinéraires dans 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);
}