sendarp的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包。)
能够成功运行的程序如下:


#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);//原程序该行和下一行都是直接使用pbHexMac
}

sprintf (szMac + j, "%02X", pbHexMac);//这里
printf ("MAC address %s\n", szMac);

delete [] szMac;

return 0;
}


文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 11625