ARP--C语言Windows实现

首先说明,此文中很大部分都是转摘的。
我首先介绍源程序来源: http://industry.ccidnet.com/art/1101/20050727/625891_1.html
这里的程序是根据MSDN  http://msdn.microsoft.com/zh-cn/library/aa366358(en-us,VS.85).aspx 上的程序改编,但是某些地方有少许问题,导致结果错误。我查看源程序(MSDN),修正了一下,实际就两个地方。这两个地方之前我是用j作为下标,错误,后来使用i作为下标,正确。(但是这种方法只能在本网段有效,据说还是使用WinPcap好些,定义自己的ARP包。)
能够成功运行的程序如下:
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <windows.h>    //要么没有,要么尽量放在其他windows相关的后边
  4. #include <iphlpapi.h>
  5. //
  6. // Link with ws2_32.lib and iphlpapi.lib
  7. //
  8. #include <tchar.h>
  9. #pragma comment(lib, "Ws2_32.lib" )
  10. #pragma comment(lib, "iphlpapi.lib") //Platform SDK
  11. /*
  12. DWORD   SendARP(  
  13. IPAddr   DestIP,           //   destination   IP   address  
  14. IPAddr   SrcIP,             //   IP   address   of   sender  
  15. PULONG   pMacAddr,       //   returned   physical   address  //PULONG 长整数无符号指针
  16. PULONG   PhyAddrLen     //   length   of   returned   physical   addr.  
  17. );   
  18. */
  19. int __cdecl main()
  20. {
  21.     HRESULT hr;
  22.     IPAddr remoteAddr;
  23.     ULONG pulMac[2];
  24.     ULONG ulLen;
  25.     remoteAddr = inet_addr ("10.86.3.6");
  26.     memset (pulMac, 0xFF, sizeof (pulMac));
  27.     ulLen = 6;
  28.     hr = SendARP (remoteAddr, 0, pulMac, &ulLen);
  29.     printf ("Return %08x, length %8d, Mac  %08x  %08x/n", hr, ulLen, pulMac[0], pulMac[1]);
  30.     size_t i, j;
  31.     char * szMac = new char[ulLen * 3];
  32.     memset(szMac, 0, ulLen*3);
  33.     PBYTE pbHexMac = (PBYTE) pulMac;//MSDN使用&pilMac,效果一样
  34.     //
  35.     // Convert the binary MAC address into human-readable
  36.     //
  37.     for (i = 0, j = 0; i < ulLen - 1; i++) {
  38.         j += sprintf (szMac + j, "%02X:"pbHexMac[i]);//原程序该行和下一行都是直接使用pbHexMac
  39.     }
  40.     sprintf (szMac + j, "%02X"pbHexMac[i]);//这里
  41.     printf ("MAC address %s/n", szMac);
  42.     delete [] szMac;
  43.     return 0;
  44. }

你可能感兴趣的:(windows,delete,语言)