我们在电脑上运行arp -a可以获取本机很多ip地址和mac地址的对应关系,我希望通过程序得到这些信息?

解决方案 »

  1.   

    使用NetBios可以得到MAC地址.#include <nb30.h>
    #pragma comment(lib, "netapi32")
    #pragma message("Auto Link NetAPI32 DLL ...") 
    /******************************************************************************
    *
    * GetMACAddr
    *
    <功    能> : 取网卡MAC地址.
    <参    数> : [out] mac MAC地址.
    <返 回 值> : 如果取得成功就返回TRUE, 否则返回FALSE.
    <备    注> : 
    <修改历史> :
    ******************************************************************************/
    BOOL
    GetMACAddr( MAC_ADDR mac )
    {
    NCB ncb;  typedef struct _ASTAT_ 
    {
    ADAPTER_STATUS adapt;
    NAME_BUFFER NameBuff [30]; 
    } ASTAT, * PASTAT; 
    ASTAT Adapter; 
    // ADAPTER_STATUS Adapter;
    LANA_ENUM lana_enum; 
    UCHAR uRetCode;  memset( &ncb, 0, sizeof(ncb) ); 
    memset( &lana_enum, 0, sizeof(lana_enum));  ncb.ncb_command = NCBENUM; 
    ncb.ncb_buffer = (unsigned char *) &lana_enum; 
    ncb.ncb_length = sizeof(LANA_ENUM); 
    uRetCode = Netbios( &ncb ); 
    if( uRetCode != NRC_GOODRET ) 
    {
    return FALSE; 
    } for( int lana=0; lana<lana_enum.length; lana++ ) 

    ncb.ncb_command = NCBRESET; 
    ncb.ncb_lana_num = lana_enum.lana[lana]; 
    uRetCode = Netbios( &ncb ); 
    if( uRetCode == NRC_GOODRET ) break ; 
    }
    if( uRetCode != NRC_GOODRET )
    {
    return FALSE;
    } memset( &ncb, 0, sizeof(ncb) ); 
    ncb.ncb_command = NCBASTAT; 
    ncb.ncb_lana_num = lana_enum.lana[0]; 
    strcpy( (char* )ncb.ncb_callname, "*" ); 
    ncb.ncb_buffer = (unsigned char *) &Adapter; 
    ncb.ncb_length = sizeof(Adapter); 
    uRetCode = Netbios( &ncb ); 
    if( uRetCode != NRC_GOODRET ) 
    {
    return FALSE;
    } memcpy( (void*)mac.m_chByte, Adapter.adapt.adapter_address, 6 ); return TRUE;
    }至于取本地IP地址, 可以调用gethostname先取得本地计算机的名称, 再调用gethostbyaddr得到IP地址.
      

  2.   

    oyljerry(☆勇敢的心☆-Paper Writing) 老兄能不能详细点
    GetMacTable
    是什么,我在msdn中也没有找到
    谢谢
      

  3.   

    使用Arp协议,Winpcap编程可以解决
    请参考http://dev.csdn.net/develop/article/48/48331.shtm
      

  4.   

    ARP表就是个字符串数组全局变量而已.
    不知道TNND MS有没有提供访问的接口,反正LINUX是很容易的
      

  5.   

    用代码来执行dos命令也可以取得到这些信息:#define EXECDOSCMD "arp -a" //可以换成你的命令
    BOOL ExecDosCmd()
    {
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead,hWrite;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
    if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
    {
    return FALSE;


    STARTUPINFO si;
    PROCESS_INFORMATION pi; 
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si); 
    si.hStdError = hWrite;
    si.hStdOutput = hWrite;
    si.wShowWindow = SW_HIDE;
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
             //关键步骤,CreateProcess函数参数意义请查阅MSDN
    if (!CreateProcess(NULL, EXECDOSCMD
    ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 
    {
    return FALSE;
    }
    CloseHandle(hWrite);

    char buffer[4096] = {0};
    DWORD bytesRead; 
    while (true) 
    {
    if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
    break;
    //buffer中就是执行的结果,可以保存到文本,也可以直接输出
                      printf(buffer);
    Sleep(200); 

             return TRUE;
    }
      

  6.   

    应该用IpHelper库,链接的时候找到IpHlper.lib
    void OnARP(HWND hwnd)
    {
       DWORD dwSize;
       MIB_IPNETTABLE *IpNet;
       MIB_IPADDRTABLE *IpAddr;
       char szTemp[10];
       HDC  hdc;
       PAINTSTRUCT ps ;        
       RECT        rect ;  
       TEXTMETRIC  tm;
       int cxChar, cxCaps, cyChar;
       
       iIndex = 0;
       hdc = BeginPaint (hwnd, &ps) ; 
       GetClientRect (hwnd, &rect) ;    
       InvalidateRect(hwnd, &rect, FALSE);
    GetTextMetrics(hdc, &tm);
    cxChar = tm.tmAveCharWidth;
    cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2 )* cxChar /2;
    cyChar = tm.tmHeight + tm.tmExternalLeading;
       IpNet = (MIB_IPNETTABLE *)GlobalAlloc( GPTR, sizeof( MIB_IPNETTABLE ) );
       dwSize = sizeof( MIB_IPNETTABLE );   if( ERROR_BUFFER_OVERFLOW == GetIpNetTable( IpNet ,&dwSize, true) )
       {
          GlobalFree( IpNet );
          IpNet =(MIB_IPNETTABLE*) GlobalAlloc( GPTR, dwSize );
       }   if( NO_ERROR == GetIpNetTable( IpNet ,&dwSize, true) )
       {
          struct   in_addr in;
          char szStdout[30];
          char szType[][10] = {"Unknown",
                               "Other",
                               "Invalid",
                               "Dynamic",
                               "Static"
                               "\x0"};
          for( DWORD i=0 ; i < IpNet->dwNumEntries ; i++ )
          {
            in.S_un.S_addr = IpNet->table[i].dwAddr;
            ::TextOut(hdc, 0, cyChar * iIndex, inet_ntoa(in), lstrlen(inet_ntoa(in)));        sprintf(szStdout, "%02X", IpNet->table[i].bPhysAddr[0]);
            for(UINT j=1 ; j < IpNet->table[i].dwPhysAddrLen ; j++)
    {
    sprintf(szTemp, "-%02X",IpNet->table[i].bPhysAddr[j]);
             strcat(szStdout, szTemp);
    }        
    ::TextOut(hdc, 300, cyChar * iIndex++, szType[IpNet->table[i].dwType], lstrlen(szType[IpNet->table[i].dwType]));
            
          }
       }
       EndPaint (hwnd, &ps) ; 
    }