Hinzufügen und Aktualisieren von Routen mithilfe von RtmAddRouteToDest
Die Funktion RtmAddRouteToDest wird verwendet, um neue Routen hinzuzufügen und vorhandene Routen für ein Ziel zu aktualisieren. Die folgenden Verfahren erläutern beide Fälle. Der folgende Beispielcode zeigt, wie die erste Prozedur implementiert wird.
Um eine Route hinzuzufügen, sollte der Client die folgenden Schritte ausführen:
Wenn der Client das Handle für den nächsten Hop bereits zwischengespeichert hat, fahren Sie mit Schritt 4 fort.
Erstellen Sie eine RTM_NEXTHOP_INFO-Struktur , und füllen Sie sie mit den entsprechenden Informationen aus.
Fügen Sie der Routingtabelle den nächsten Hop hinzu, indem Sie RtmAddNextHop aufrufen. Der Routingtabellen-Manager gibt ein Handle an den nächsten Hop zurück. Wenn der nächste Hop bereits vorhanden ist, fügt die Routingtabelle den nächsten Hop nicht hinzu. stattdessen wird das Handle zum nächsten Hop zurückgegeben.
Erstellen Sie eine RTM_ROUTE_INFO-Struktur , und füllen Sie sie mit den entsprechenden Informationen aus, einschließlich des vom Routingtabellen-Manager zurückgegebenen Handles für den nächsten Hop.
Fügen Sie die Route der Routingtabelle hinzu, indem Sie RtmAddRouteToDest aufrufen. Der Routingtabellen-Manager vergleicht die neue Route mit den Routen, die sich bereits in der Routingtabelle befinden. Zwei Routen sind gleich, wenn alle der folgenden Bedingungen erfüllt sind:
- Die Route wird demselben Ziel hinzugefügt.
- Die Route wird vom gleichen Client hinzugefügt, wie vom Owner-Member der RTM_ROUTE_INFO-Struktur angegeben.
- Die Route wird von demselben Nachbarn angekündigt, der vom Neighbor-Element der RTM_ROUTE_INFO-Struktur angegeben wird.
Wenn die Route vorhanden ist, gibt der Routingtabellen-Manager das Handle an die vorhandene Route zurück. Andernfalls fügt der Routingtabellen-Manager die Route hinzu und gibt das Handle an die neue Route zurück.
Der Client kann den parameter Change_Flags auf RTM_ROUTE_CHANGE_NEW festlegen, um den Routingtabellen-Manager anzuweisen, eine neue Route auf dem Ziel hinzuzufügen, auch wenn eine andere Route mit denselben Besitzer- und Nachbarfeldern vorhanden ist.
Der Client kann den parameter Change_Flags auf RTM_ROUTE_CHANGE_FIRST festlegen, um den Routingtabellen-Manager anweisen, die erste Route auf dem Ziel zu aktualisieren, das sich im Besitz des Clients befindet. Dieses Update kann ausgeführt werden, wenn eine solche Route vorhanden ist, auch wenn das Nachbarfeld nicht übereinstimmt. Dieses Flag wird von Clients verwendet, die eine einzelne Route pro Ziel verwalten.
Um eine Route zu aktualisieren, sollte der Client die folgenden Schritte ausführen:
- Rufen Sie RtmGetRouteInfo mit dem Handle für die Route auf. Das Handle ist entweder eines, das zuvor vom Client zwischengespeichert oder vom Routingtabellen-Manager von einem Aufruf zurückgegeben wird, der ein Routinghandle wie RtmGetRouteInfo zurückgibt.
- Nehmen Sie die Änderungen an der RTM_ROUTE_INFO-Struktur vor , die vom Routingtabellen-Manager zurückgegeben wird.
- Rufen Sie RtmAddRouteToDest mit dem Handle für die Route und der geänderten RTM_ROUTE_INFO-Struktur auf.
Der folgende Beispielcode zeigt, wie Sie eine Route zu einem Ziel hinzufügen, indem Sie den Routingtabellen-Manager als Vermittler verwenden.
// Add a route to a destination given by (addr, masklen)
// using a next hop reachable with an interface
RTM_NEXTHOP_INFO NextHopInfo;
// First, create and add a next hop to the caller's
// next-hop tree (if it does not already exist)
ZeroMemory(&NextHopInfo, sizeof(RTM_NEXTHOP_INFO);
RTM_IPV4_MAKE_NET_ADDRESS(&NextHopInfo.NextHopAddress,
nexthop, // Address of the next hop
32);
NextHopInfo.InterfaceIndex = interface;
NextHopHandle = NULL;
Status = RtmAddNextHop(RtmRegHandle,
&NextHopInfo,
&NextHopHandle,
&ChangeFlags);
if (Status == NO_ERROR)
{
// Created a new next hop or found an old one
// Fill in the route information for the route
ZeroMemory(&RouteInfo, sizeof(RTM_ROUTE_INFO);
// Fill in the destination network's address and mask values
RTM_IPV4_MAKE_NET_ADDRESS(&NetAddress, addr, masklen);
// Assume 'neighbour learnt from' is the first next hop
RouteInfo.Neighbour = NextHopHandle;
// Set metric for route; Preference set internally
RouteInfo.PrefInfo.Metric = metric;
// Adding a route to both the unicast and multicast views
RouteInfo.BelongsToViews = RTM_VIEW_MASK_UCAST|RTM_VIEW_MASK_MCAST;
RouteInfo.NextHopsList.NumNextHops = 1;
RouteInfo.NextHopsList.NextHops[0] = NextHopHandle;
// If you want to add a new route, regardless of
// whether a similar route already exists, use the following
// ChangeFlags = RTM_ROUTE_CHANGE_NEW;
ChangeFlags = 0;
Status = RtmAddRouteToDest(RtmRegHandle,
&RouteHandle, // Can be NULL if you do not need handle
&NetAddress,
&RouteInfo,
1000, // Time out route after 1000 ms
RouteListHandle1, // Also add the route to this list
0,
NULL,
&ChangeFlags);
if (Status == NO_ERROR)
{
if (ChangeFlags & RTM_ROUTE_CHANGE_NEW)
{
; // A new route has been created
}
else
{
; // An existing route is updated
}
if (ChangeFlags & RTM_ROUTE_CHANGE_BEST)
{
; // Best route information has changed
}
// Release the route handle if you do not need it
RtmReleaseRoutes(RtmRegHandle, 1, &RouteHandle);
}
// Also release the next hop since it is no longer needed
RtmReleaseNextHops(RtmRegHandle, 1, &NextHopHandle);
}