用SendARP API函数获取远程主机MAC地址学习心得

我是一个闲不住的人,刚搞完禁用WebQQ的IE BHO插件,又迷上了WOL,众所周知,要写一个WOL的利用程序必须先得到远程主机群的MAC地址数据库,那怎样去获取这个数据库呢?是在每一个远程主机上安装客户端?呵呵,我开始就是这样想的,但在后来的学习中,我发现自己真傻,人家Microsoft明明提供了一个SendARP的API,就这么一个API就可以不在远程主机安装客户端的情况下获取它的MAC地址,原理很简单,就是利用ARP协议。于是,一连串的问题就围绕着这个函数展开了。

       先在MSDN中找了段代码,直接粘到VC6中,代码我就不贴出来了,自己去MSDN里找SendARP吧,编译,果然出错了:

--------------------Configuration: SendARPDemo - Win32 Release--------------------
Compiling...
SendArp.cpp
E:\SOFT\MICROSOFT SDKS\WINDOWS\V6.0A\INCLUDE\ifdef.h(153) : error C2146: syntax error : missing ';' before identifier 'NET_IFTYPE'
E:\SOFT\MICROSOFT SDKS\WINDOWS\V6.0A\INCLUDE\ifdef.h(153) : fatal error C1004: unexpected end of file found
执行 cl.exe 时出错.

SendARPDemo.exe - 1 error(s), 0 warning(s)


       这是什么错误我暂不深究,此处唯一的亮点是出错的文件居然是微软的头文件,即E:\SOFT\MICROSOFT SDKS\WINDOWS\V6.0A\INCLUDE\ifdef.h,我潜意识告诉我,微软的东东不可能有错,所以,这个错误必定不简单。老规矩,先百度,网上有大佬发过类似错误的求助帖,可惜的是没人回帖,唉,自己动手吧,就一行一行地注释代码,看究竟是哪行代码有问题。当我把 #include <iphlpapi.h> 这句注释了的时候,错误没有出现了,怎么会这样?难道是iphlpapi.h的问题?不对啊,SendARP函数就包含在这个头文件中啊,没它怎么行。没办法,再以iphlpapi为关键字在百度上搜索,最终的答案是VC6下根本就没有iphlpapi.h这个头文件,Microsoft是从VC7才开始加入那个头文件的,于是我果断把代码放到VS2010中去,果然编译通过了,那问题又来了,怎样才能在VC6下编译通过呢?

       SendARP函数返回的远程主机MAC地址是一个无符号的长整型数组,那要怎样才能把它转成字符串呢?MSDN的示例代码提供了一个繁琐的转换过程,网上有牛人把它简化了,下面是整个程序的源代码:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <iphlpapi.h>
#pragma comment(lib,"iphlpapi.lib")
#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])
{
    HRESULT hr;
    IPAddr  ipAddr;
    ULONG   pulMac[2];
    ULONG   ulLen;
    char strMacAddr[100]={0};
    ipAddr = inet_addr ("10.1.6.3");
    memset (pulMac, 0xff, sizeof (pulMac));
    ulLen = 6;
    hr = SendARP (ipAddr, 0, pulMac, &ulLen);
     if(hr!=NO_ERROR)
     {
        printf("Nothing Find!");
        return 1;
     }
    unsigned char * mac_addr=(unsigned char*)pulMac;
    sprintf(strMacAddr,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x\n",mac_addr[0],mac_addr[1],mac_addr[2],mac_addr[3],mac_addr[4],mac_addr[5]);
    printf(strMacAddr);
    system("pause");
    return 0;
}

posted @ 2010-12-04 19:47  swtar  阅读(2684)  评论(0编辑  收藏  举报