admin管理员组文章数量:1531658
2024年7月30日发(作者:)
C++取得系统中网卡MAC地址的三种方法
做好的程序员一如做人。多看多想或许他山之石可以攻玉,但永远不要成为代码的奴隶。
CKER
原著:Borland
TranslatedbyCKER
第一种方法使用Microsoft的NetbiosAPI。这是一套通过Winsock提供底层网络支
持的命令。使用Netbios的最大缺点是您必须在系统中安装了Netbios服务(如果您在
windows网络中启用了文件共享的话,这就不是问题了)。除此此外,这种方法又快又准确。
NetbiosAPI只包括了一个函数,就叫做Netbios。这个函数使用网络控制块(network
controlblock)结构作为参数,这个结构告诉函数要做什么。结构的定义如下:
typedefstrUCt_NCB{
UCHAR
UCHAR
UCHAR
UCHAR
ncb_command;
ncb_retcode;
ncb_lsn;
ncb_num;
PUCHARncb_buffer;
Word
UCHAR
UCHAR
UCHAR
UCHAR
ncb_length;
ncb_callname[NCBNAMSZ];
ncb_name[NCBNAMSZ];
ncb_rto;
ncb_sto;
void(CALLBACK*ncb_post)(struct_NCB*);
UCHAR
UCHAR
ncb_lana_num;
ncb_cmd_cplt;
#ifdef_WIN64
UCHAR
#else
UCHAR
#endif
ncb_reserve[10];
ncb_reserve[18];
HANDLEncb_event;
}NCB,*PNCB;
重点在于ncb_command成员。这个成员告诉Netbios该作什么。我们使用三个命令来
探测MAC地址。他们在MSDN的定义如下:
命令描述:
NCBENUMWindowsNT/2000:列举系统中网卡的数量。使用此命令后,ncb_buffer成员
指向由LANA_ENUM结构填充的缓冲区。
NCBENUM不是标准的NetBIOS3.0命令。
NCBRESET重置网卡。网卡在接受新的NCB命令之前必须重置。
int(r_address[0]),
int(r_address[1]),
int(r_address[2]),
int(r_address[3]),
int(r_address[4]),
int(r_address[5]));
mac_addr=acMAC;
returntrue;
}
else
{
mac_addr="bad(NCBASTAT):";
mac_addr+=string(_retcode);
returnfalse;
}
}
intmain()
{
//取得网卡列表
LANA_ENUMAdapterList;
NCBNcb;
memset(&Ncb,0,sizeof(NCB));
_command=NCBENUM;
_buffer=(unsignedchar*)&AdapterList;
_length=sizeof(AdapterList);
Netbios(&Ncb);
//取得本地以太网卡的地址
stringmac_addr;
for(inti=0;i<-1;++i)
{
if(GetAdapterInfo([i],mac_addr))
{
cout<<"Adapter"< "'sMACis"< } else { cerr<<"FailedtogetMACaddress!Doyou"< cerr<<"havetheNetBIOSprotocolinstalled?"< break; } } return0; } file://------------------------------------------------------------------------ --- 第二种方法-使用COMGUIDAPI 这种方法使用COMAPI创建一个GUID(全局唯一标识符)并从那里继承MAC地址。GUID 通常用来标识COM组件以及系统中的其他对象。它们是由MAC地址(结合其他东西)计算得来 的,表面上MAC地址就包含在其中。我说表面上是因为事实上并没有包含。 我提供这种方法更多的是为了作为反面教材。您也许用这种方法能够得到MAC地址,但 有时候您只会得到随机的十六进制数值。 下面的例子十分简单,无需多讲。我们使用CoCreateGuid创建GUID,并将最后六个字 节放入字符串中。它们可能是MAC地址,但并不是必然的。 #include #include #include usingnamespacestd; intmain() { cout<<"MACaddressis:"; //向COM要求一个UUID。如果机器中有以太网卡, //UUID最后的六个字节(Data4的2-7字节)应该是本地以太网卡的MAC地址。 GUIDuuid; CoCreateGuid(&uuid); //Spittheaddressout &nbs
版权声明:本文标题:C++取得系统中网卡MAC地址的三种方法 内容由热心网友自发贡献,该文观点仅代表作者本人,
转载请联系作者并注明出处:https://m.elefans.com/dianzi/1722318763a925852.html,
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论