1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
 
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
 
 
 
/*
 * SendARP, based on Microsofts MSDN SendARP example code.
 *
 */
int main(int argc, char **argv)
{
  int lRetVal = 0;
  DWORD lFuncRetVal = 0;
  IPAddr lDestIp = 0;
  IPAddr lSrcIp = 0;       /* default for src ip */
  ULONG lMACAddr[2];       /* for 6-byte hardware addresses */
  ULONG lPhysAddrLen = 6;  /* default to length of six bytes */
  BYTE *lPhysAddr = NULL;
  int lCount = 0;
 
 
 
  if (argc > 1) 
  {
    lDestIp = inet_addr(argv[1]);
    memset(&lMACAddr, 0xff, sizeof(lMACAddr));
 
    printf("Sending ARP request for IP address: %s\n", argv[1]);
 
 
    if ((lFuncRetVal = SendARP(lDestIp, lSrcIp, &lMACAddr, &lPhysAddrLen)) == NO_ERROR) 
	{
      if (lPhysAddr = (BYTE *) & lMACAddr) 
	  {
        for (lCount = 0; lCount < (int)lPhysAddrLen; lCount++) 
        {
          if (lCount == (lPhysAddrLen - 1))
            printf("%.2X\n", (int) lPhysAddr[lCount]);
          else
            printf("%.2X-", (int) lPhysAddr[lCount]);
        } // for (i = 0...
      } // if (bPhysA...
      else
        printf("Warning: SendArp completed successfully, but returned length=0\n");
 
    } 
    else 
    {
      printf("Error: SendArp failed with error: %d", lFuncRetVal);
      switch (lFuncRetVal) 
      {
        case ERROR_GEN_FAILURE:
            printf(" (ERROR_GEN_FAILURE)\n");
            break;
        case ERROR_INVALID_PARAMETER:
            printf(" (ERROR_INVALID_PARAMETER)\n");
            break;
        case ERROR_INVALID_USER_BUFFER:
            printf(" (ERROR_INVALID_USER_BUFFER)\n");
            break;
        case ERROR_BAD_NET_NAME:
            printf(" (ERROR_GEN_FAILURE)\n");
            break;
        case ERROR_BUFFER_OVERFLOW:
            printf(" (ERROR_BUFFER_OVERFLOW)\n");
            break;
        case ERROR_NOT_FOUND:
            printf(" (ERROR_NOT_FOUND)\n");
            break;
        default:
            printf("\n");
            break;
      } // switch (dw...
    } // if (SendA...
  }
  else
    printf("Usage: %s ip-address\n", argv[0]);
 
  return(lRetVal);
}