zoukankan      html  css  js  c++  java
  • 获取远程网卡MAC地址(VC++)

    View Code
      1 ××××××××××××××××××××××××××
      2    获取远程网卡MAC地址。   
      3 ××××××××××××××××××××××××××
      4 
      5 
      6 首先在头文件定义中加入#include "nb30.h"
      7 #pragma comment(lib,"netapi32.lib")
      8 typedef struct _ASTAT_
      9 {
     10 ADAPTER_STATUS adapt;
     11 NAME_BUFFER    NameBuff[30];
     12 } ASTAT, * PASTAT;
     13 
     14 就可以这样调用来获取远程网卡MAC地址了:
     15 CString GetMacAddress(CString sNetBiosName)
     16 {
     17     ASTAT Adapter;
     18 
     19     NCB ncb;
     20     UCHAR uRetCode;
     21 
     22     memset(&ncb, 0, sizeof(ncb));
     23     ncb.ncb_command = NCBRESET;
     24     ncb.ncb_lana_num = 0;
     25 
     26     uRetCode = Netbios(&ncb);
     27 
     28     memset(&ncb, 0, sizeof(ncb));
     29     ncb.ncb_command = NCBASTAT;
     30     ncb.ncb_lana_num = 0;
     31 
     32     sNetBiosName.MakeUpper();
     33 
     34     FillMemory(ncb.ncb_callname, NCBNAMSZ - 1, 0x20);
     35 
     36     strcpy((char *)ncb.ncb_callname, (LPCTSTR) sNetBiosName);
     37 
     38     ncb.ncb_callname[sNetBiosName.GetLength()] = 0x20;
     39     ncb.ncb_callname[NCBNAMSZ] = 0x0;
     40 
     41     ncb.ncb_buffer = (unsigned char *) &Adapter;
     42     ncb.ncb_length = sizeof(Adapter);
     43 
     44     uRetCode = Netbios(&ncb);
     45     
     46     CString sMacAddress;
     47 
     48     if (uRetCode == 0)
     49     {
     50      sMacAddress.Format(_T("%02x%02x%02x%02x%02x%02x"),
     51          Adapter.adapt.adapter_address[0],
     52             Adapter.adapt.adapter_address[1],
     53             Adapter.adapt.adapter_address[2],
     54             Adapter.adapt.adapter_address[3],
     55             Adapter.adapt.adapter_address[4],
     56             Adapter.adapt.adapter_address[5]);
     57     }
     58     return sMacAddress;
     59 }
     60 
     61 
     62 
     63 --------------------------------------------------------------------------------
     64 
     65 
     66 ××××××××××××××××××××××××××××××××××××××××
     67 用NetBIOS的API获得网卡MAC地址
     68 ××××××××××××××××××××××××××××××××××××××××
     69 
     70 #include "Nb30.h"
     71 #pragma comment (lib,"netapi32.lib")
     72 
     73 
     74 typedef struct tagMAC_ADDRESS
     75 {
     76 BYTE b1,b2,b3,b4,b5,b6;
     77 }MAC_ADDRESS,*LPMAC_ADDRESS;
     78 
     79 typedef struct tagASTAT 
     80 { 
     81 ADAPTER_STATUS adapt; 
     82 NAME_BUFFER    NameBuff [30]; 
     83 }ASTAT,*LPASTAT; 
     84 
     85 UCHAR GetAddressByIndex(int lana_num, ASTAT &Adapter)
     86 {
     87 NCB ncb; 
     88 UCHAR uRetCode; 
     89 memset(&ncb, 0, sizeof(ncb) ); 
     90 ncb.ncb_command = NCBRESET; 
     91 ncb.ncb_lana_num = lana_num; 
     92 //指定网卡号,首先对选定的网卡发送一个NCBRESET命令,以便进行初始化 
     93 uRetCode = Netbios(&ncb ); 
     94 memset(&ncb, 0, sizeof(ncb) ); 
     95 ncb.ncb_command = NCBASTAT; 
     96 ncb.ncb_lana_num = lana_num;   //指定网卡号 
     97 strcpy((char *)ncb.ncb_callname,"*      " ); 
     98 ncb.ncb_buffer = (unsigned char *)&Adapter; 
     99 //指定返回的信息存放的变量 
    100 ncb.ncb_length = sizeof(Adapter); 
    101 //接着,可以发送NCBASTAT命令以获取网卡的信息 
    102 uRetCode = Netbios(&ncb ); 
    103 return uRetCode;
    104 } 
    105 
    106 int GetMAC(LPMAC_ADDRESS pMacAddr)
    107 {
    108 NCB ncb; 
    109 UCHAR uRetCode;
    110 int num = 0;
    111 LANA_ENUM lana_enum; 
    112 memset(&ncb, 0, sizeof(ncb) ); 
    113 ncb.ncb_command = NCBENUM; 
    114 ncb.ncb_buffer = (unsigned char *)&lana_enum; 
    115 ncb.ncb_length = sizeof(lana_enum); 
    116 ////向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡
    117 ////每张网卡的编号等 
    118 uRetCode = Netbios(&ncb);
    119 if (uRetCode == 0) 
    120 {
    121    num = lana_enum.length;
    122    //对每一张网卡,以其网卡编号为输入编号,获取其MAC地址 
    123    for (int i = 0; i < num; i++)
    124    {
    125     ASTAT Adapter;
    126     if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)
    127     {
    128      pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];
    129      pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];
    130      pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];
    131      pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];
    132      pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];
    133      pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];
    134     }
    135    }
    136 }
    137 return num;
    138 }
    139 
    140 ======= 调用:
    141 
    142       MAC_ADDRESS m_MacAddr[10];        // 比如最多10个网卡
    143       int n = GetMAC(m_MacAddr);        // 获得网卡数量
    144 
    145 
    146 TCHAR szAddr[128];
    147 wsprintf(szAddr,_T("%02x-%02x-%02x-%02x-%02x-%02x"),
    148                           m_MacAddr[0].b1,m_MacAddr[0].b2,
    149                     m_MacAddr[0].b3,m_MacAddr[0].b4,
    150                             m_MacAddr[0].b5,m_MacAddr[0].b6);
    151 _tcsupr(szAddr);                 
    152 
    153          // 这样就能获得诸如    00-E0-aa-aa-aa-aa 这样的MAC地址字符串
    154 
    155 
    156 
    157 --------------------------------------------------------------------------------
    158 
    159 
    160 ××××××××××××××××××××××××××××××××××××××××
    161 用IP Helper API来获得网卡地址
    162 ××××××××××××××××××××××××××××××××××××××××
    163 
    164    呵呵,最常用的方法放在了最后
    165 
    166    用 GetAdaptersInfo函数
    167 
    168    这里获得了一个网卡的大部分信息,朋友们可酌情选用^_^
    169 
    170 #include <Iphlpapi.h>
    171 #pragma comment(lib, "Iphlpapi.lib")
    172 
    173 typedef struct tagAdapterInfo          
    174 {
    175 char szDeviceName[128];           // 名字
    176 char szIPAddrStr[16];             // IP
    177 char szHWAddrStr[18];             // MAC
    178 DWORD dwIndex;                    // 编号          
    179 }INFO_ADAPTER, *PINFO_ADAPTER;
    180 
    181 INFO_ADAPTER AdapterList[ 10];               // 网卡列表,比如十个
    182 /****************************************************************************
    183 *    Name & Params::
    184 * formatMACToStr
    185 * (
    186 *   LPSTR lpHWAddrStr : 显示出来的加 "-"的 mac字符串
    187 *          unsigned char *HWAddr : 传入的MAC字符串
    188 * )
    189 *    Purpose:
    190 *   将用户输入的MAC地址字符转成相应格式
    191 ****************************************************************************/
    192 void formatMACToStr(LPSTR lpHWAddrStr,const unsigned char *HWAddr)
    193 {
    194 int i;
    195 short temp;
    196 char szStr[3];
    197 
    198 strcpy(lpHWAddrStr, "");
    199 for (i=0; i<6; ++i)
    200 {
    201    temp = (short)(*(HWAddr + i));
    202    _itoa(temp, szStr, 16);
    203    if (strlen(szStr) == 1) strcat(lpHWAddrStr, "0");
    204    strcat(lpHWAddrStr, szStr);
    205    if (i<5) strcat(lpHWAddrStr, "-");         // 加上 - 
    206 }
    207 }
    208 
    209 // 填充结构
    210 void GetAdapterInfo()
    211 {
    212 char tempChar;
    213 ULONG uListSize=1;
    214 PIP_ADAPTER_INFO pAdapter;   // 定义PIP_ADAPTER_INFO结构存储网卡信息
    215 int nAdapterIndex = 0;
    216 
    217 DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, 
    218                         &uListSize); // 关键函数
    219 
    220 if (dwRet == ERROR_BUFFER_OVERFLOW)
    221 {
    222 PIP_ADAPTER_INFO pAdapterListBuffer = 
    223                      (PIP_ADAPTER_INFO)new(char[uListSize]);
    224 dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);
    225 if (dwRet == ERROR_SUCCESS)
    226 {
    227       pAdapter = pAdapterListBuffer;
    228       while (pAdapter) // 枚举网卡
    229               {
    230    CString strTemp = pAdapter->AdapterName;   // 网卡名字
    231    strTemp = "//Device//NPF_" + strTemp;    // 加上前缀 
    232       strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);
    233 
    234 strcpy(AdapterList[nAdapterIndex].szIPAddrStr, 
    235                       pAdapter->IpAddressList.IpAddress.String );// IP
    236 
    237 formatMACToStr( AdapterList[nAdapterIndex].szHWAddrStr, 
    238                       pAdapter->Address ); // MAC!!!!!!!!!!!!!!!!!
    239 
    240 AdapterList[nAdapterIndex].dwIndex = pAdapter->Index;           // 编号
    241 
    242 pAdapter = pAdapter->Next;
    243 
    244 nAdapterIndex ++;
    245 }
    246 delete pAdapterListBuffer;
    247 }
    248 }
    249 }
  • 相关阅读:
    wget 报错 OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failur
    zabbix 利用python脚本实现短信告警
    zabbix 利用python脚本实现钉钉告警
    linux安装python3
    软件系统的高可靠性衡量标准
    安装linux版zabbix客户端
    windows环境安装zabbix客户端
    linux下安装zabbix服务器
    centos6安装nginx
    CentOS6编译安装php5.3
  • 原文地址:https://www.cnblogs.com/FCoding/p/2634493.html
Copyright © 2011-2022 走看看