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

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

    delete [] szMac; 

    return 0; 





有什么问题可以加群,100852896
点击这里加入此群 在线提问
文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 9632
博主QQ: 友情链接请找我
QQ群: 灰色档案
返回顶部 关闭