一分钟学会获取本机网卡物理地址(MAC)
2006-11-03 13:33
591 查看
做网络编程的程序员免不了要与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]);
}
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]);
}
相关文章推荐
- 获取机器网卡的物理(MAC)地址
- JS获取客户端网卡物理地址(MAC) 代码
- php获取机器网卡的物理(MAC)地址
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- VC获取物理网卡的MAC地址
- PHP获取客户端的网卡mac物理地址
- VC++ 用NetAPI获取网卡的物理MAC地址
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- PHP获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址
- C#获取本机和其它计算机物理网卡地址(MAC)
- VC 获取物理网卡的MAC地址
- 获取机器网卡的物理(MAC)地址
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- C++之获取网卡物理地址(MAC)
- C#获取本机和其它计算机物理网卡地址(MAC)
- VC 获取物理网卡的MAC地址
- VC 获取物理网卡的MAC地址
- 获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址
- 获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址
- 枚举和获取网卡物理MAC地址