www.pudn.com > IPRoute.rar > IPRoute.cpp


////////////////////////////////////////////////////////////////////// 
// IPRoute.cpp文件 
 
 
#include  
#include  
#include  
 
#pragma comment(lib, "Iphlpapi.lib") 
#pragma comment(lib, "WS2_32.lib") 
 
 
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder); 
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab); 
void PrintIpForwardTable(); 
 
 
 
int main() 
{ 
	PrintIpForwardTable(); 
 
	return 0; 
} 
 
void PrintIpForwardTable() 
{ 
	PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE); 
	if(pIpRouteTable != NULL) 
	{ 
		DWORD i, dwCurrIndex; 
		struct in_addr inadDest; 
		struct in_addr inadMask; 
		struct in_addr inadGateway;   
		PMIB_IPADDRTABLE pIpAddrTable = NULL; 
		 
		char szDestIp[128]; 
		char szMaskIp[128]; 
		char szGatewayIp[128]; 
 
		printf("Active Routes:\n\n"); 
		 
		printf("  Network Address          Netmask  Gateway Address        Interface  Metric\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; 
			// 网关地址 
			inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop; 
			 
			strcpy(szDestIp, inet_ntoa(inadDest)); 
			strcpy(szMaskIp, inet_ntoa(inadMask)); 
			strcpy(szGatewayIp, inet_ntoa(inadGateway)); 
			printf("  %15s %16s %16s %16d %7d\n",  
                szDestIp,  
                szMaskIp,  
                szGatewayIp,  
                pIpRouteTable->table[i].dwForwardIfIndex,	// 可以在此调用GetIpAddrTable获取索引对应的IP地址 
                pIpRouteTable->table[i].dwForwardMetric1); 
		} 
		MyFreeIpForwardTable(pIpRouteTable); 
	} 
} 
 
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder) 
{ 
	PMIB_IPFORWARDTABLE pIpRouteTab = NULL; 
    DWORD dwActualSize = 0; 
     
    // 查询所需缓冲区的大小 
    if(::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER) 
	{ 
        // 为MIB_IPFORWARDTABLE结构申请内存 
        pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize); 
        // 获取路由表 
		if(::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR) 
			return pIpRouteTab; 
		::GlobalFree(pIpRouteTab); 
    } 
	return NULL; 
} 
 
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab) 
{ 
	if(pIpRouteTab != NULL) 
		::GlobalFree(pIpRouteTab); 
}