获取网卡MAC地址

以前也贴过相关的文章,这次再加上,全面一些吧!
做网络编程的程序员免不了要与MAC地址打交道,这个128bit的数字串在某种程度上就代表了机器的唯一性,因此在做统计工作时一般都以MAC地址作为标准。 下面介绍两种获取本机MAC地址的方式。1. 通过请求NetBios服务获取MAC地址;2. 通过IpHelpApi获取。 第一种方法要求本机开启了NetBios服务,由于有部分机器已经禁用了这项服务,因此获取时可能失败, 个人比较推荐第二种方法。


1。通过请求NetBios服务获取MAC地址。使用库Netapi32.lib

  1. struct ASTAT    
  2. {   
  3.  ADAPTER_STATUS adapt;    
  4.  NAME_BUFFER NameBuff [30];    
  5. };   
  6.   
  7. bool GetMacByNetBios(unsigned char * mac)   
  8. {   
  9.  if(!mac)   
  10.  {   
  11.   return false;   
  12.  }   
  13.   
  14.  ASTAT Adapter;   
  15.  NCB ncb;   
  16.     
  17.  memset( &ncb, 0, sizeof(ncb) );    
  18.  ncb.ncb_command = NCBRESET;    
  19.  ncb.ncb_lana_num = 0;    
  20.  Netbios( &ncb );    
  21.     
  22.  memset( &ncb, 0, sizeof(ncb) );    
  23.  ncb.ncb_command = NCBASTAT;    
  24.  ncb.ncb_lana_num = 0;    
  25.  strcpy( (char *)ncb.ncb_callname, "* " );    
  26.  ncb.ncb_buffer = (unsigned char *) &Adapter;    
  27.  ncb.ncb_length = sizeof(Adapter);    
  28.     
  29.  if(Netbios(&ncb) == 0)   
  30.  {   
  31.   memcpy(mac, Adapter.adapt.adapter_address, 6);   
  32.   return true;   
  33.  }   
  34.  else  
  35.  {   
  36.   memset(mac, 0, 6);   
  37.   return false;   
  38.  }   
  39. }   



2。通过IpHelpApi获取,使用库Iphlpapi.lib
  1. #include <IPHlpApi.h>   
  2.   
  3. bool GetMacByIpHelp(unsigned char * mac)   
  4. {   
  5.  if(!mac)   
  6.  {   
  7.   return false;   
  8.  }   
  9.     
  10.  ULONG ulOutBufLen = 0;   
  11.  if(GetAdaptersInfo(NULL, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW )   
  12.  {   
  13.   int nDivisor = sizeof(IP_ADAPTER_INFO);   
  14.   if(sizeof(time_t) == 8)   
  15.    nDivisor -= 8;   
  16.      
  17.   int nCount = ulOutBufLen / nDivisor;   
  18.   PIP_ADAPTER_INFO pAdapterInfo = new IP_ADAPTER_INFO[nCount];   
  19.      
  20.   if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS )   
  21.   {   
  22.    delete[] pAdapterInfo;   
  23.    memset(mac, 0, 6);   
  24.    return false;   
  25.   }   
  26.   else  
  27.   {   
  28.    memcpy(mac, pAdapterInfo->Address, 6);   
  29.    delete[] pAdapterInfo;   
  30.    return true;   
  31.   }   
  32.  }   
  33.  else  
  34.  {   
  35.   memset(mac, 0, 6);   
  36.   return false;   
  37.  }   
  38. }   



以上两个函数的使用方法如下:
  1. void main (void)   
  2. {   
  3.  unsigned char mac[6];   
  4.  GetMacByNetBios(mac);   
  5.  printf("Get MAC by NetBios: %02X%02X%02X%02X%02X%02X/n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);   
  6.   
  7.  GetMacByNetBios(mac);   
  8.  printf("Get MAC by IpHelp: %02X%02X%02X%02X%02X%02X/n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);   
  9. }    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值