É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 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 comprend, mais n’est pas limité à une plage de destinations, une interface particulière et les vues dans lesquelles les informations résident.
- 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 l’erreur plus d' _ _ _ éléments. Les données d’itinéraire, 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 mesure, si les itinéraires sont énumérés).
- Appelez RtmReleaseDests, RtmReleaseRoutes et RtmReleaseNextHops lorsque les descripteurs ou structures d’informations associés à 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 dans l’état de blocage sont énumérés uniquement lorsqu’un client demande des données de toutes les vues à l’aide du _ _ masque de vue RTM _ 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);
}