现在的位置: 首页 > 综合 > 正文

一分钟学会获取本机网卡物理地址(MAC)

2013年08月11日 ⁄ 综合 ⁄ 共 1703字 ⁄ 字号 评论关闭

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

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

struct ASTAT
{
 ADAPTER_STATUS adapt;
 NAME_BUFFER NameBuff [30];
};

bool GetMacByNetBios(unsigned char * mac)
{
 if(!mac)
 {
  return false;
 }

 ASTAT Adapter;
 NCB ncb;
 
 memset( &ncb, 0, sizeof(ncb) );
 ncb.ncb_command = NCBRESET;
 ncb.ncb_lana_num = 0;
 Netbios( &ncb );
 
 memset( &ncb, 0, sizeof(ncb) );
 ncb.ncb_command = NCBASTAT;
 ncb.ncb_lana_num = 0;
 strcpy( (char *)ncb.ncb_callname, "* " );
 ncb.ncb_buffer = (unsigned char *) &Adapter;
 ncb.ncb_length = sizeof(Adapter);
 
 if(Netbios(&ncb) == 0)
 {
  memcpy(mac, Adapter.adapt.adapter_address, 6);
  return true;
 }
 else
 {
  memset(mac, 0, 6);
  return false;
 }
}

 

2。通过IpHelpApi获取,使用库Iphlpapi.lib

#include <IPHlpApi.h>

bool GetMacByIpHelp(unsigned char * mac)
{
 if(!mac)
 {
  return false;
 }
 
 ULONG ulOutBufLen = 0;
 if(GetAdaptersInfo(NULL, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW )
 {
  int nDivisor = sizeof(IP_ADAPTER_INFO);
  if(sizeof(time_t) == 8)
   nDivisor -= 8;
  
  int nCount = ulOutBufLen / nDivisor;
  PIP_ADAPTER_INFO pAdapterInfo = new IP_ADAPTER_INFO[nCount];
  
  if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS )
  {
   delete[] pAdapterInfo;
   memset(mac, 0, 6);
   return false;
  }
  else
  {
   memcpy(mac, pAdapterInfo->Address, 6);
   delete[] pAdapterInfo;
   return true;
  }
 }
 else
 {
  memset(mac, 0, 6);
  return false;
 }
}

 

以上两个函数的使用方法如下:

void main (void)
{
 unsigned char mac[6];
 GetMacByNetBios(mac);
 printf("Get MAC by NetBios: %02X%02X%02X%02X%02X%02X/n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

 GetMacByNetBios(mac);
 printf("Get MAC by IpHelp: %02X%02X%02X%02X%02X%02X/n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
 

抱歉!评论已关闭.