Pesquisar rotas usando uma árvore de prefixo
O código de exemplo a seguir mostra como usar RtmGetMostSpecificDestination e RtmGetLessSpecificDestination para percorrer a árvore de prefixo na tabela de roteamento.
// Used to walk up the prefix tree, given the destination and mask
// Search for a best matching route to a network
// given (address,mask) for this destination network
// First get the best matching destination
RTM_IPV4_SET_ADDR_AND_MASK(NetAddress, Addr, Mask);
Status = RtmGetMostSpecificDestination(RtmRegHandle,
&NetAddress,
RTM_BEST_PROTOCOL, // Determines which route information is returned.
RTM_VIEW_MASK_UCAST, // Give the information for best unicast route
DestInfo1);
// Use RtmGetLessSpecificDestination to go up the
// tree until it returns ERROR_NOT_FOUND. Use two
// RTM_DEST_INFO buffers - DestInfo1 & DestInfo2
// alternately to avoid all unnecessary copying.
while (Status == NO_ERROR)
{
if (DestInfo1->DestAddress.NumBits == NetAddress.NumBits)
{
Print("Exact Match of Destination\n");
}
Status = RtmGetLessSpecificDestination(RtmRegHandle,
DestInfo1->DestHandle,
RTM_BEST_PROTOCOL,
RTM_VIEW_MASK_UCAST,
DestInfo2);
// NOTE that the buffer is DestInfo1 and not DestInfo2
RtmReleaseDestInfo(RtmRegHandle, DestInfo1);
if (Status != NO_ERROR)
{
break;
}
// Use any information you want in DestInfo2
Print("Mask Len: %d\n", DestInfo2->DestAddress.NumBits);
Status = RtmGetLessSpecificDestination(RtmRegHandle,
DestInfo2->DestHandle,
RTM_BEST_PROTOCOL,
RTM_VIEW_MASK_UCAST,
DestInfo1);
// NOTE that the buffer is DestInfo2 and not DestInfo1
RtmReleaseDestInfo(RtmRegHandle, DestInfo2);
if (Status != NO_ERROR)
{
break;
}
// Use any information you want in DestInfo1
Print("Mask Len: %d\n", DestInfo1->DestAddress.NumBits);
}