我首先介紹源程序來源: 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;
- }