📄 iparp.cpp
字号:
/*---------------------------------------------------------------------------
Copyright (c) 1998 Microsoft Corporation
Module Name: IpArp.exe
File : IpArp.cpp
Description: This file demonstrates the use of IP Helper APIs to
manipulate ARP cache.
Author:
Frank Li April 16, 1998
Revision History:
Who When What
-------- -------- ----------------------------------
Frank Li 04-16-98 created
---------------------------------------------------------------------------*/
#include "IpArp.h"
void Usage(char * pszProgramName)
{
printf("%s -s inet_addr eth_addr [if_addr]\n", pszProgramName);
printf("%s -d inet_addr [if_addr]\n", pszProgramName);
printf("%s -a\n", pszProgramName);
printf("-a Displays current ARP entries by interrogating the current\n");
printf(" protocol data.\n");
printf("-d Deletes the host specified by inet_addr.\n");
printf("-s Adds the host and associates the Internet address inet_addr\n");
printf(" with the Physical address eth_addr. The Physical address is\n");
printf(" given as 6 hexadecimal bytes separated by hyphens. The entry\n");
printf(" is permanent.\n");
printf("eth_addr Specifies a physical address.\n");
printf("if_addr If present, this specifies the Internet address of the\n");
printf(" interface whose address translation table should be modified.\n");
printf(" If not present, the first applicable interface will be used.\n");
printf("Example:\n");
printf(" >IpArp -s 157.55.85.212 00-aa-bb-cc-dd-ee 0x2000003 .... Add a static\n");
printf(" arp entry on interface number 0x2000003.\n");
printf(" >IpArp -a ....Displays the arp table.\n");
printf(" >IpArp -d 157.55.85.212 ....Delete an entry.\n");
WSACleanup();
exit(1);
}
void _cdecl main(int argc, char **argv)
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"\n Wrong version\n");
return;
}
if ((argc < 2) || (argv[1][0] != '-'))
Usage("IpArp");
if (strlen(argv[1]) > 2)
Usage("IpArp");
switch(argv[1][1])
{
case 'a':
// Print arp table
DoGetIpNetTable();
break;
case 's':
//Update or add an ARP Internet/Ethernet Address entry
if (argc == 4)
DoSetIpNetEntry(argv[2], argv[3]);
else if (argc == 5)
DoSetIpNetEntry(argv[2], argv[3], argv[4]);
else
Usage("IpArp");
break;
case 'd':
//Delete an Internet/Ethernet Address pair from the ARP table
if (argc == 3)
DoDeleteIpNetEntry(argv[2]);
else if (argc == 4)
DoDeleteIpNetEntry(argv[2], argv[3]);
else
Usage("IpArp");
break;
default:
// help
Usage("IpArp");
break;
}
WSACleanup();
}
void DoGetIpNetTable()
{
DWORD dwStatus;
PMIB_IPNETTABLE pIpArpTab = NULL;
if ( (dwStatus = MyGetIpNetTable(pIpArpTab, TRUE)) == NO_ERROR)
{
PrintIpNetTable(pIpArpTab);
free(pIpArpTab);
return;
}
else if ( dwStatus == ERROR_NO_DATA)
{
printf("No entries in arp cache.\n");
if (pIpArpTab)
free (pIpArpTab);
return;
}
else
{
if (pIpArpTab)
free (pIpArpTab);
printf("IpArp returned 0x%x\n", dwStatus);
return;
}
}
//----------------------------------------------------------------------------
// Add an arp entry with ip dotted decimal address of "pszDottedInetAddr" and
// physical address of "pszPhysAddr" in 00-aa-bb-cc-dd-ee format on interface
// index of "pszInterface" in hex form.
//----------------------------------------------------------------------------
void DoSetIpNetEntry(char* pszDottedInetAddr, char* pszPhysAddr, char* pszInterface)
{
DWORD dwInetAddr = 0; // ip address
DWORD dwStatus;
BYTE bPhysAddr[MAXLEN_PHYSADDR];
if (pszDottedInetAddr == NULL || pszPhysAddr == NULL)
{
printf("IpArp: Bad Argument\n");
return;
}
dwInetAddr = inet_addr(pszDottedInetAddr); // convert dotted ip addr. to ip addr.
if (dwInetAddr == INADDR_NONE)
{
printf("IpArp: Bad Argument %s\n", pszDottedInetAddr);
return;
}
if (StringToPhysAddr(pszPhysAddr, (char*)bPhysAddr ) != 0)
{
printf("IpArp: Bad Argument %s\n", pszPhysAddr);
return;
}
MIB_IPNETROW arpEntry; // an arp entry
if (pszInterface)
{
// User provides a interface index number
sscanf(pszInterface, "%X",&(arpEntry.dwIndex));
}
else
{
// add this to the first available interface
PMIB_IPADDRTABLE pIpAddrTable = NULL;
if ( (dwStatus = MyGetIpAddrTable(pIpAddrTable)) != NO_ERROR)
{
printf("IpArp: Couldn't find a interface number to add your arp entry\n");
return;
}
arpEntry.dwIndex = pIpAddrTable->table[0].dwIndex;
free(pIpAddrTable);
}
arpEntry.dwPhysAddrLen = 6;
memcpy(arpEntry.bPhysAddr, bPhysAddr, 6);
arpEntry.dwAddr = dwInetAddr;
arpEntry.dwType = MIB_IPNET_TYPE_STATIC; //static arp entry
dwStatus = SetIpNetEntry(&arpEntry);
if (dwStatus != NO_ERROR)
{
printf("IpArp: couldn't add (%s, %s), dwStatus = %lu.\n",
pszDottedInetAddr, pszPhysAddr, dwStatus);
}
}
//----------------------------------------------------------------------------
// Delete an arp entry with ip dotted decimal address of "pszDottedInetAddr"
// and interface index of "pszInterface" in hex form.
//----------------------------------------------------------------------------
void DoDeleteIpNetEntry(char* pszDottedInetAddr, char* pszInterface)
{
DWORD dwInetAddr = 0; // ip address
DWORD dwStatus;
if (pszDottedInetAddr == NULL)
{
printf("IpArp: Bad Argument\n");
return;
}
dwInetAddr = inet_addr(pszDottedInetAddr); // convert dotted ip addr. to ip addr.
if (dwInetAddr == INADDR_NONE)
{
printf("IpArp: Bad Argument %s\n", pszDottedInetAddr);
return;
}
MIB_IPNETROW arpEntry; // an arp entry
if (pszInterface)
{
// User provides a interface index number
sscanf(pszInterface, "%X",&(arpEntry.dwIndex));
}
else
{
// try to delete this from first available interface
PMIB_IPADDRTABLE pIpAddrTable = NULL;
if ( (dwStatus = MyGetIpAddrTable(pIpAddrTable)) != NO_ERROR)
{
printf("IpArp: Couldn't find a interface number to add your arp entry\n");
return;
}
arpEntry.dwIndex = pIpAddrTable->table[0].dwIndex;
free(pIpAddrTable);
}
arpEntry.dwAddr = dwInetAddr;
dwStatus = DeleteIpNetEntry(&arpEntry);
if (dwStatus != NO_ERROR)
{
printf("IpArp: couldn't delete (%s), dwStatus = %lu.\n",
pszDottedInetAddr, dwStatus);
}
}
//----------------------------------------------------------------------------
// 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;
}
//-------------------------------------------------------------------------
// Input: str points to an ethernet address of the form 00-aa-bb-cc-dd-ee
// If it returns 0, ret contains the 6 bytes ethernet address.
//-------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -