网上也查询了很多个文章,没有一个是完整的列出如何通过API进行路由的操作。
一下编程语言为C++,windows7下测试通过.
#include <IPHlpApi.h>
#pragma comment(lib, "Iphlpapi.lib")
ULONG getadpterindex(const char *ip)
{PIP_ADAPTER_INFO pAdaptersInfo=NULL;
unsigned long nLen=0;
unsigned long nError;
//获取要申请空间的大小
//根据网关地址取得对应的网卡索引......鉴于无人回复,此处省略100字
g_dwInterfaceIndex = 0;
return 0;
}
//根据网卡索引取metric
DWORD GetInterfaceMetric(DWORD dwIndex)
{
//获取相应的metric
//...依然省略100字
return 0;
BOOL CreateRoute(char * pIp, char * pMask, char * pGateway)
{
DWORD dwRetVal;
int nAdapterIndex = 0;
MIB_IPFORWARDROW IpForwardRow={0};
ZeroMemory(&IpForwardRow,sizeof(MIB_IPFORWARDROW));
IpForwardRow.dwForwardDest = inet_addr(pIp);
IpForwardRow.dwForwardMask = inet_addr(pMask);
IpForwardRow.dwForwardNextHop = inet_addr(pGateway);
//接口索引
IpForwardRow.dwForwardIfIndex = getadpterindex(pGateway);
IpForwardRow.dwForwardMetric1 = GetInterfaceMetric( IpForwardRow.dwForwardIfIndex);
IpForwardRow.dwForwardAge = 0;
IpForwardRow.dwForwardMetric2=0xFFFFFFFF;
IpForwardRow.dwForwardMetric3=0xFFFFFFFF;
IpForwardRow.dwForwardMetric4=0xFFFFFFFF;
IpForwardRow.dwForwardMetric5=0xFFFFFFFF;
IpForwardRow.dwForwardNextHopAS=0;
IpForwardRow.dwForwardPolicy=0;
IpForwardRow.dwForwardProto = MIB_IPPROTO_NETMGMT;
IpForwardRow.dwForwardType = MIB_IPROUTE_TYPE_DIRECT;
dwRetVal = CreateIpForwardEntry(&IpForwardRow);
if (dwRetVal == NO_ERROR){
TRACE0("Gateway changed successfully\n");
}else{
TRACE2("Error: %d, errno = %d\r\n", dwRetVal, errno);
if(dwRetVal == ERROR_INVALID_PARAMETER)
TRACE0("Invalid parameter.\r\n");
}
return TRUE;
}
//删除指定网关的所有路由
VOID DeleteRoute(char * pGateway)
{
PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
DWORD dwStatus = 0;
DWORD dwSize = 0;
BOOL bOrder = FALSE;
unsigned long int i = 0;
dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
if( dwStatus != ERROR_INSUFFICIENT_BUFFER){
TRACE0("GetIpForwardTable failed.\n");
return;
}
pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(dwSize);
if(GetIpForwardTable(pIpForwardTable, &dwSize, TRUE) != NO_ERROR)
{
free(pIpForwardTable);
pIpForwardTable = NULL;
TRACE(_T("GetIPForward Error/n"));
return ;
}
for(i = 0; i < pIpForwardTable->dwNumEntries; i++){
struct in_addr addrIp, addrMask, addrGateway;
//此处仅为示例,获取网关对应的网卡接口getadpterindex(pGateway)需要在函数外面执行,目前只是为了让代码看起来更完整
addrIp.s_addr = pIpForwardTable->table[i].dwForwardDest;
addrMask.s_addr = pIpForwardTable->table[i].dwForwardMask;
addrGateway.s_addr = pIpForwardTable->table[i].dwForwardNextHop;
TRACE3("ROUTE: %s %s %s\n", \
inet_ntoa(addrIp),
inet_ntoa(addrMask),
inet_ntoa(addrGateway));
if(strcmp(inet_ntoa(addrIp), pIp) == 0){
TRACE1("删除路由: %s\n", pIp);
DeleteIpForwardEntry(&pIpForwardTable->table[i]);
}
}
}
if(pIpForwardTable){
delete pIpForwardTable;
pIpForwardTable = NULL;
}
}