📄 iparp.cpp
字号:
int StringToPhysAddr(char* szInEther, char* szOutEther)
{
const char DASH = '-';
register char c;
register int val;
// check szInEther for the correct format
if (strlen(szInEther) != 17)
return (-1);
if (szInEther[2] != DASH || szInEther[5] != DASH || szInEther[8] != DASH ||
szInEther[8] != DASH || szInEther[14] != DASH)
return (-1);
if (!isxdigit(szInEther[0]) || !isxdigit(szInEther[1]) ||
!isxdigit(szInEther[3]) || !isxdigit(szInEther[4]) ||
!isxdigit(szInEther[6]) || !isxdigit(szInEther[7]) ||
!isxdigit(szInEther[9]) || !isxdigit(szInEther[10]) ||
!isxdigit(szInEther[12]) || !isxdigit(szInEther[13]) ||
!isxdigit(szInEther[15]) || !isxdigit(szInEther[16]))
return (-1);
// convert the 12 hex decimals back to 6 digit decimals
for (int i = 0; i < 6; i++)
{
val = 0;
c = toupper(szInEther[i*3]);
c = c - (isdigit(c) ? '0' : ('A' - 10)); //offset adjustment
val += c;
val = (val << 4); // val * 16
c = toupper(szInEther[i*3 + 1]);
c = c - (isdigit(c) ? '0' : ('A' - 10)); // offset adjustement
val += c;
szOutEther[i] = val;
}
return (0);
}
//----------------------------------------------------------------------------
// Inputs: PhysAddr is the hardware address in bytes
// PhysAddrLen is the length of the PhysAddr
// Outputs: if it returns TRUE, str is the hex formated string of the hardware
// address.
// NOTE: make sure str is TRIPLE as big as PhysAddrLen
//----------------------------------------------------------------------------
bool PhysAddrToString(BYTE PhysAddr[], DWORD PhysAddrLen, char str[])
{
if (PhysAddr == NULL || PhysAddrLen == 0 || str == NULL)
return FALSE;
str[0] = '\0';
for (DWORD dwIdx = 0; dwIdx < PhysAddrLen; dwIdx++)
{
if (dwIdx == PhysAddrLen-1)
sprintf(str+(dwIdx*3), "%02X", ((int)PhysAddr[dwIdx])&0xff);
else
sprintf(str+(dwIdx*3), "%02X-", ((int)PhysAddr[dwIdx])&0xff);
}
return TRUE;
}
//----------------------------------------------------------------------------
// arp table format to be printed:
// Interface: 157.61.239.34 on Interface 2
// Internet Address Physical Address Type
// 159.61.230.39 00-aa-00-61-5d-a4 dynamic
//
// Interface: 157.54.178.219 on Interface 3
// Internet Address Physical Address Type
// 159.54.170.1 00-10-54-42-c0-88 dynamic
// 159.54.170.113 00-aa-00-c0-80-2e dynamic
//----------------------------------------------------------------------------
void PrintIpNetTable(PMIB_IPNETTABLE pIpNetTable)
{
DWORD i, dwStatus, dwCurrIndex;
struct in_addr inadTmp;
char szPrintablePhysAddr[256];
char szType[128];
char szIpAddr[128];
PMIB_IPADDRTABLE pIpAddrTable = NULL;
if (pIpNetTable == NULL)
{
printf( "pIpNetTable == 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);
// Note: the ARP table should be sorted in interface index
dwCurrIndex = pIpNetTable->table[0].dwIndex;
if (InterfaceIdxToInterfaceIp(pIpAddrTable, dwCurrIndex, szIpAddr))
{
printf("\nInterface: %s on Interface 0x%X\n", szIpAddr, dwCurrIndex);
printf(" Internet Address Physical Address Type\n");
}
else
{
printf("Error: Could not convert Interface number 0x%X to IP address.\n",
pIpNetTable->table[0].dwIndex);
return;
}
for (i = 0; i < pIpNetTable->dwNumEntries; ++i)
{
if (pIpNetTable->table[i].dwIndex != dwCurrIndex)
{
dwCurrIndex = pIpNetTable->table[i].dwIndex;
if (InterfaceIdxToInterfaceIp(pIpAddrTable, dwCurrIndex, szIpAddr))
{
printf("Interface: %s on Interface 0x%X\n", szIpAddr, dwCurrIndex);
printf(" Internet Address Physical Address Type\n");
}
else
{
printf("Error: Could not convert Interface number 0x%X to IP address.\n",
pIpNetTable->table[0].dwIndex);
return;
}
}
PhysAddrToString(pIpNetTable->table[i].bPhysAddr, pIpNetTable->table[i].dwPhysAddrLen, szPrintablePhysAddr);
inadTmp.s_addr = pIpNetTable->table[i].dwAddr;
switch (pIpNetTable->table[i].dwType)
{
case 1:
strcpy(szType,"other");
break;
case 2:
strcpy(szType,"invalidated");
break;
case 3:
strcpy(szType,"dynamic");
break;
case 4:
strcpy(szType,"static");
break;
default:
strcpy(szType,"invalidType");
}
printf(" %-16s %-17s %-11s\n", inet_ntoa(inadTmp), szPrintablePhysAddr, szType);
}
if (pIpAddrTable)
free(pIpAddrTable);
}
//----------------------------------------------------------------------------
// Format of IP Address Table:
// ipAdEntAddr ifAdEntIfIndex ipAdEntNetMask ipAdEntBcastAddr ipAdEntReasmMaxSize
//----------------------------------------------------------------------------
void PrintIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable)
{
DWORD i;
struct in_addr inadTmp1;
struct in_addr inadTmp2;
char szAddr[128];
char szMask[128];
if (pIpAddrTable == NULL)
{
printf( "pIpAddrTable == NULL in line %d\n", __LINE__);
return;
}
printf("ipAdEntAddr\t ifAdEntIfIndex\t ipAdEntNetMask\t ipAdEntBcastAddr\t ipAdEntReasmMaxSize\n");
for (i = 0; i < pIpAddrTable->dwNumEntries; ++i)
{
inadTmp1.s_addr = pIpAddrTable->table[i].dwAddr;
strcpy(szAddr, inet_ntoa(inadTmp1));
inadTmp2.s_addr = pIpAddrTable->table[i].dwMask;
strcpy(szMask, inet_ntoa(inadTmp2));
printf(" %s\t 0x%X\t %s\t %s\t %u\n",
szAddr,
pIpAddrTable->table[i].dwIndex,
szMask,
(pIpAddrTable->table[i].dwBCastAddr ? "255.255.255.255" : "0.0.0.0"),
pIpAddrTable->table[i].dwReasmSize);
}
}
//----------------------------------------------------------------------------
// Input : fOrder -- sorts the output IP Addr Table
// Output: If it returns NO_ERROR, pIpAddrTable points to the IP Addr 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;
}
}
//----------------------------------------------------------------------------
// Input : fOrder -- sorts the output IP Net Table
// Output: If it returns NO_ERROR, pIpNetTable points to the IP Net Table
//----------------------------------------------------------------------------
DWORD MyGetIpNetTable(PMIB_IPNETTABLE& pIpNetTable, bool fOrder)
{
DWORD status = NO_ERROR;
DWORD statusRetry = NO_ERROR;
DWORD dwActualSize = 0;
// query for buffer size needed
dwActualSize = 0;
status = GetIpNetTable(pIpNetTable, &dwActualSize, fOrder);
if (status == NO_ERROR)
{
return status;
}
else if (status == ERROR_INSUFFICIENT_BUFFER)
{
// need more space
pIpNetTable = (PMIB_IPNETTABLE) malloc(dwActualSize);
assert(pIpNetTable);
statusRetry = GetIpNetTable(pIpNetTable, &dwActualSize, fOrder);
if (statusRetry != NO_ERROR)
{
#ifdef _DEBUG
printf("Retry failed.\n");
#endif
return statusRetry;
}
else
{
return statusRetry;
}
}
else
{
#ifdef _DEBUG
printf("first getipnettable call failed\n");
#endif
return status;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -