📄 iproute.cpp
字号:
}
if ( (dwStatus = MyGetIpForwardTable(pIpRouteTab, TRUE)) == NO_ERROR)
{
for (i = 0; i < pIpRouteTab->dwNumEntries; i++)
{
if (dwForwardDest == pIpRouteTab->table[i].dwForwardDest)
{
memcpy(&routeEntry, &(pIpRouteTab->table[i]), sizeof(MIB_IPFORWARDROW));
dwDelStatus = DeleteIpForwardEntry(&routeEntry);
if (dwDelStatus != NO_ERROR)
{
printf("IpRoute: couldn't delete (%s), dwStatus = %lu.\n",
pszDest, dwDelStatus);
return;
}
else
fDeleted = TRUE;
}
}
free(pIpRouteTab);
if (! fDeleted)
printf("IpRoute: The route specified was not found.\n");
return;
}
else if ( dwStatus == ERROR_NO_DATA)
{
printf("IpRoute: No entries in route table.\n");
if (pIpRouteTab)
free (pIpRouteTab);
return;
}
else
{
if (pIpRouteTab)
free (pIpRouteTab);
printf("IpRoute returned 0x%x\n", dwStatus);
return;
}
}
//----------------------------------------------------------------------------
// If returned status is NO_ERROR, then pIpRouteTab points to a routing
// table.
//----------------------------------------------------------------------------
DWORD MyGetIpForwardTable(PMIB_IPFORWARDTABLE& pIpRouteTab, BOOL fOrder)
{
DWORD status = NO_ERROR;
DWORD statusRetry = NO_ERROR;
DWORD dwActualSize = 0;
// query for buffer size needed
status = GetIpForwardTable(pIpRouteTab, &dwActualSize, fOrder);
if (status == NO_ERROR)
{
printf("No error\n");
return status;
}
else if (status == ERROR_INSUFFICIENT_BUFFER)
{
// need more space
pIpRouteTab = (PMIB_IPFORWARDTABLE) malloc(dwActualSize);
assert(pIpRouteTab);
statusRetry = GetIpForwardTable(pIpRouteTab, &dwActualSize, fOrder);
return statusRetry;
}
else
{
return status;
}
}
//----------------------------------------------------------------------------
// Print out ip routing table in the following format:
//Active Routes:
//
// Network Address Netmask Gateway Address Interface Metric
// 0.0.0.0 0.0.0.0 157.54.176.1 157.54.177.149 1
// 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
// 157.54.176.0 255.255.252.0 157.54.177.149 157.54.177.149 1
// 157.54.177.149 255.255.255.255 127.0.0.1 127.0.0.1 1
// 157.54.255.255 255.255.255.255 157.54.177.149 157.54.177.149 1
// 224.0.0.0 224.0.0.0 157.54.177.149 157.54.177.149 1
// 255.255.255.255 255.255.255.255 157.54.177.149 157.54.177.149 1
//----------------------------------------------------------------------------
void PrintIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTable)
{
DWORD i, dwStatus, dwCurrIndex;
struct in_addr inadDest;
struct in_addr inadMask;
struct in_addr inadGateway;
char szIpAddr[128]; // ip address of an interface index
PMIB_IPADDRTABLE pIpAddrTable = NULL;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
if (pIpRouteTable == NULL)
{
printf( "pIpRouteTable == NULL in line %d\n", __LINE__);
return;
}
// get IP Address Table for mapping interface index number to ip address
if ( (dwStatus = MyGetIpAddrTable(pIpAddrTable)) != NO_ERROR)
{
printf("GetIpAddrTable returned 0x%x\n", dwStatus);
if (pIpAddrTable)
free(pIpAddrTable);
return;
}
assert(pIpAddrTable);
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;
if (InterfaceIdxToInterfaceIp(pIpAddrTable, dwCurrIndex, szIpAddr) == FALSE)
{
printf("Error: Could not convert Interface number 0x%X to IP address.\n",dwCurrIndex);
if (pIpAddrTable)
free(pIpAddrTable);
return;
}
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 %16s %7d\n",
szDestIp,
szMaskIp,
szGatewayIp,
szIpAddr,
pIpRouteTable->table[i].dwForwardMetric1);
}
if (pIpAddrTable)
free(pIpAddrTable);
}
//----------------------------------------------------------------------------
// Inputs: pIpAddrTable is the IP address table
// dwIndex is the Interface Number
// Output: If it returns TRUE, str contains the ip address of the interface
//----------------------------------------------------------------------------
bool InterfaceIdxToInterfaceIp(PMIB_IPADDRTABLE pIpAddrTable, DWORD dwIndex, char str[])
{
struct in_addr inadTmp;
char* szIpAddr;
if (pIpAddrTable == NULL || str == NULL)
return FALSE;
str[0] = '\0';
for (DWORD dwIdx = 0; dwIdx < pIpAddrTable->dwNumEntries; dwIdx++)
{
if (dwIndex == pIpAddrTable->table[dwIdx].dwIndex)
{
inadTmp.s_addr = pIpAddrTable->table[dwIdx].dwAddr;
szIpAddr = inet_ntoa(inadTmp);
if (szIpAddr)
{
strcpy(str, szIpAddr);
return TRUE;
}
else
return FALSE;
}
}
return FALSE;
}
//----------------------------------------------------------------------------
// Inputs: pIpAddrTable is the IP address table
// str is the Interface Ip address in dotted decimal format
// Output: If it returns TRUE, dwIndex contains the interface index number
// and dwMask contains the corresponding subnet mask.
//----------------------------------------------------------------------------
bool InterfaceIpToIdxAndMask(PMIB_IPADDRTABLE pIpAddrTable, char str[], DWORD& dwIndex, DWORD& dwMask)
{
DWORD dwIfIpAddr; // Interface Ip Address
if (pIpAddrTable == NULL)
return FALSE;
dwIfIpAddr = inet_addr(str);
if (dwIfIpAddr == INADDR_NONE)
return FALSE;
for (DWORD dwIdx = 0; dwIdx < pIpAddrTable->dwNumEntries; dwIdx++)
{
if (dwIfIpAddr == pIpAddrTable->table[dwIdx].dwAddr)
{
dwIndex = pIpAddrTable->table[dwIdx].dwIndex;
dwMask = pIpAddrTable->table[dwIdx].dwMask;
return TRUE;
}
}
return FALSE;
}
//----------------------------------------------------------------------------
// If returned status is NO_ERROR, then pIpAddrTable points to a Ip Address
// table.
//----------------------------------------------------------------------------
DWORD MyGetIpAddrTable(PMIB_IPADDRTABLE& pIpAddrTable, BOOL fOrder)
{
DWORD status = NO_ERROR;
DWORD statusRetry = NO_ERROR;
DWORD dwActualSize = 0;
// query for buffer size needed
status = GetIpAddrTable(pIpAddrTable, &dwActualSize, fOrder);
if (status == NO_ERROR)
{
printf("No error\n");
return status;
}
else if (status == ERROR_INSUFFICIENT_BUFFER)
{
// need more space
pIpAddrTable = (PMIB_IPADDRTABLE) malloc(dwActualSize);
assert(pIpAddrTable);
statusRetry = GetIpAddrTable(pIpAddrTable, &dwActualSize, fOrder);
return statusRetry;
}
else
{
return status;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -