歌舞程序

导航

获得系统路由表信息

该程序用于获取系统的路由信息,,,在删除某条路由记录时,本想通过DeleteIpForwardEntry函数实现,发现需要指定dwForwardPolicy ,该字段不是很清楚,因此通过遍历路由表,然后匹配要删除的路由表的目的、网关IP来实现 。 

#include <Windows.h>

#include <stdio.h>
#include <IPHlpApi.h>
#include "conio.h"
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib") 

void PrintForwardTable();

PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder);
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab);
int main11111()
{
PrintForwardTable();
getch();
return 0;
}
void PrintForwardTable()
{
PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE);
if (pIpRouteTable != NULL)
{
DWORD i, dwCurrIndex;
struct in_addr inadDest;
struct in_addr inadMask;
struct in_addr inadGataway;
PMIB_IPFORWARDTABLE pIpAddrTable = NULL;
char szDestIp[256];
char szMaskIp[128];
char szGatawayIp[128];
printf("\t\t\t\t活动的路由\n\n");
printf("        网络地址         网络掩码        网关地址               接口  优先权\n");
for (i = 0; i < pIpRouteTable->dwNumEntries; i++)
{
dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;
inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;
inadGataway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;
strcpy(szDestIp, inet_ntoa(inadDest));
strcpy(szMaskIp, inet_ntoa(inadMask));
strcpy(szGatawayIp, inet_ntoa(inadGataway));
printf(" %15s %16s %16s %16d %7d\n", 
szDestIp, 
szMaskIp, 
szGatawayIp, 
pIpRouteTable->table[i].dwForwardIfIndex, // 可以在此调用GetIpAddrTable获取索引对应的IP地址
pIpRouteTable->table[i].dwForwardMetric1);
}
}
MyFreeIpForwardTable(pIpRouteTable);
}
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder)
{
PMIB_IPFORWARDTABLE pIpForwardTab = NULL;
DWORD dwActualSize = 0;
if (::GetIpForwardTable(pIpForwardTab, &dwActualSize,  bOrder) == ERROR_INSUFFICIENT_BUFFER)
{
pIpForwardTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);
if (::GetIpForwardTable(pIpForwardTab, &dwActualSize, bOrder) == NO_ERROR) 
return pIpForwardTab;
::GlobalFree(pIpForwardTab);
}
return NULL;
}
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab)
{
if (pIpRouteTab != NULL)
GlobalFree(pIpRouteTab);
}
void main()
{
PrintForwardTable();
getch();
 getchar();
 return ;
}

-------------------删除某条IP记录------------

bool DeleteRouteRecord(const std::string& strDestIp, const std::string& strMaskIp,
  const std::string& strGatewayIp)
{
PMIB_IPFORWARDTABLE pIpForwardTab = NULL;
DWORD dwActualSize = 0;
if (::GetIpForwardTable(pIpForwardTab, &dwActualSize,  TRUE) == ERROR_INSUFFICIENT_BUFFER)
{
pIpForwardTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);
if (::GetIpForwardTable(pIpForwardTab, &dwActualSize, TRUE) != NO_ERROR) 
{
::GlobalFree(pIpForwardTab);
return false;
}
}
if (pIpForwardTab != NULL)
{
DWORD i, dwCurrIndex;
PMIB_IPFORWARDTABLE pIpAddrTable = NULL;
DWORD dwRet = NO_ERROR +1;
for (i = 0; i < pIpForwardTab->dwNumEntries; i++)
{
if(pIpForwardTab->table[i].dwForwardDest == inet_addr(strDestIp.c_str()) &&
  pIpForwardTab->table[i].dwForwardMask == inet_addr(strMaskIp.c_str())&&
  pIpForwardTab->table[i].dwForwardNextHop == inet_addr(strGatewayIp.c_str()))
{
TSDEBUG4CXX(_T("delete the route destip:") << strDestIp.c_str());
dwRet=DeleteIpForwardEntry(&pIpForwardTab->table[i]);
break;
}
}
GlobalFree(pIpForwardTab);
if (dwRet == NO_ERROR)
{
return true;
}
}
return false;

posted on 2012-09-05 12:44  歌舞程序  阅读(495)  评论(0编辑  收藏  举报