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); } |