使用API进行路由操作

网上也查询了很多个文章,没有一个是完整的列出如何通过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)需要在函数外面执行,目前只是为了让代码看起来更完整

        if(pIpForwardTable->table[i].dwForwardIfIndex ==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;
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值