首先说明,此文中很大部分都是转摘的。
我首先介绍源程序来源: 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包。)
能够成功运行的程序如下:
我首先介绍源程序来源: 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包。)
能够成功运行的程序如下:
- #include <stdio.h>
- #include <winsock2.h>
- #include <windows.h> //要么没有,要么尽量放在其他windows相关的后边
- #include <iphlpapi.h>
- //
- // Link with ws2_32.lib and iphlpapi.lib
- //
- #include <tchar.h>
- #pragma comment(lib, "Ws2_32.lib" )
- #pragma comment(lib, "iphlpapi.lib") //Platform SDK
- /*
- DWORD SendARP(
- IPAddr DestIP, // destination IP address
- IPAddr SrcIP, // IP address of sender
- PULONG pMacAddr, // returned physical address //PULONG 长整数无符号指针
- PULONG PhyAddrLen // length of returned physical addr.
- );
- */
- int __cdecl main()
- {
- HRESULT hr;
- IPAddr remoteAddr;
- ULONG pulMac[2];
- ULONG ulLen;
- remoteAddr = inet_addr ("10.86.3.6");
- memset (pulMac, 0xFF, sizeof (pulMac));
- ulLen = 6;
- hr = SendARP (remoteAddr, 0, pulMac, &ulLen);
- printf ("Return %08x, length %8d, Mac %08x %08x/n", hr, ulLen, pulMac[0], pulMac[1]);
- size_t i, j;
- char * szMac = new char[ulLen * 3];
- memset(szMac, 0, ulLen*3);
- PBYTE pbHexMac = (PBYTE) pulMac;//MSDN使用&pilMac,效果一样
- //
- // Convert the binary MAC address into human-readable
- //
- for (i = 0, j = 0; i < ulLen - 1; i++) {
- j += sprintf (szMac + j, "%02X:", pbHexMac[i]);//原程序该行和下一行都是直接使用pbHexMac
- }
- sprintf (szMac + j, "%02X", pbHexMac[i]);//这里
- printf ("MAC address %s/n", szMac);
- delete [] szMac;
- return 0;
- }