Auflisten aller Routen
Das folgende Verfahren beschreibt die Schritte, die zum Auflisten einer der von der RTMv2-API verwendeten Entitäten verwendet werden. Der folgende Beispielcode zeigt, wie alle Routen aufgelistet werden.
Der grundlegende Prozess für jede Enumeration lautet wie folgt:
- Starten Sie die Enumeration, indem Sie ein Handle vom Routingtabellen-Manager abrufen. Rufen Sie RtmCreateDestEnum, RtmCreateRouteEnum und RtmCreateNextHopEnum auf, um die Kriterien anzugeben, die die Art der aufgezählten Informationen angeben. Zu diesen Kriterien gehören unter anderem eine Reihe von Zielen, eine bestimmte Schnittstelle und die Ansichten, in denen sich die Informationen befinden.
- Rufen Sie RtmGetEnumDests, RtmGetEnumRoutes und RtmGetEnumNextHops einmal oder mehrmals auf, um Daten abzurufen, bis der Routingtabellen-Manager ERROR_NO_MORE_ITEMS zurückgibt. Die Routen-, Ziel- und Next-Hop-Daten werden in der Reihenfolge der Adressinformationen (und der Einstellungs- und Metrikwerte, wenn Routen aufgelistet werden) zurückgegeben.
- Rufen Sie RtmReleaseDests, RtmReleaseRoutes und RtmReleaseNextHops auf, wenn die der Enumeration zugeordneten Handles oder Informationsstrukturen nicht mehr erforderlich sind.
- Rufen Sie RtmDeleteEnumHandle auf, um das Enumerationshandle freizugeben, das beim Erstellen der Enumeration zurückgegeben wurde. Diese Funktion wird verwendet, um das Handle für alle Typen von Enumerationen freizugeben.
Hinweis
Routen, die sich im Haltezustand befinden, werden nur aufgelistet, wenn ein Client Daten von allen Ansichten mit RTM_VIEW_MASK_ANY anfordert.
Der folgende Beispielcode zeigt, wie alle Routen in der Routingtabelle aufgelistet werden.
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);
}