C获取网卡MAC地址Word下载.docx
- 文档编号:14741324
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:12
- 大小:18.59KB
C获取网卡MAC地址Word下载.docx
《C获取网卡MAC地址Word下载.docx》由会员分享,可在线阅读,更多相关《C获取网卡MAC地址Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
UCHARncb_rto;
UCHARncb_sto;
void(CALLBACK*ncb_post)(struct_NCB*);
UCHARncb_lana_num;
UCHARncb_cmd_cplt;
#ifdef_WIN64
UCHARncb_reserve[18];
#else
UCHARncb_reserve[10];
#endif
HANDLEncb_event;
}NCB,*PNCB;
重点在于ncb_command成员。
这个成员告诉Netbios该作什么。
我们使用三个命令来探测MAC地址。
他们在MSDN的定义如下:
命令描述:
NCBENUMWindowsNT/2000:
列举系统中网卡的数量。
使用此命令后,ncb_buffer成员指向由LANA_ENUM结构填充的缓冲区。
NCBENUM不是标准的NetBIOS3.0命令。
NCBRESET重置网卡。
网卡在接受新的NCB命令之前必须重置。
NCBASTAT接受本地或远程接口卡的状态。
使用此命令后,ncb_buffer成员指向由ADAPTER_STATUS结构填充的缓冲区,随后是NAME_BUFFER结构的数组。
下面就是取得您系统MAC地址的步骤:
1》列举所有的接口卡。
2》重置每块卡以取得它的正确信息。
3》查询接口卡,取得MAC地址并生成标准的冒号分隔格式。
下面就是实例源程序。
netbios.cpp
#include<
windows.h>
stdlib.h>
stdio.h>
iostream>
string>
usingnamespacestd;
#definebzero(thing,sz)memset(thing,0,sz)
boolGetAdapterInfo(intadapter_num,string&
mac_addr)
{
//重置网卡,以便我们可以查询
NCBNcb;
memset(&
Ncb,0,sizeof(Ncb));
Ncb.ncb_command=NCBRESET;
Ncb.ncb_lana_num=adapter_num;
if(Netbios(&
Ncb)!
=NRC_GOODRET){
mac_addr="
bad(NCBRESET):
"
;
mac_addr+=string(Ncb.ncb_retcode);
returnfalse;
}
//准备取得接口卡的状态块
bzero(&
Ncb,sizeof(Ncb);
Ncb.ncb_command=NCBASTAT;
strcpy((char*)Ncb.ncb_callname,"
*"
);
structASTAT
ADAPTER_STATUSadapt;
NAME_BUFFERNameBuff[30];
}Adapter;
Adapter,sizeof(Adapter));
Ncb.ncb_buffer=(unsignedchar*)&
Adapter;
Ncb.ncb_length=sizeof(Adapter);
//取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。
Ncb)==0)
characMAC[18];
sprintf(acMAC,"
%02X:
%02X"
int(Adapter.adapt.adapter_address[0]),
int(Adapter.adapt.adapter_address[1]),
int(Adapter.adapt.adapter_address[2]),
int(Adapter.adapt.adapter_address[3]),
int(Adapter.adapt.adapter_address[4]),
int(Adapter.adapt.adapter_address[5]));
mac_addr=acMAC;
returntrue;
else
bad(NCBASTAT):
intmain()
//取得网卡列表
LANA_ENUMAdapterList;
Ncb,0,sizeof(NCB));
Ncb.ncb_command=NCBENUM;
AdapterList;
Ncb.ncb_length=sizeof(AdapterList);
Netbios(&
Ncb);
//取得本地以太网卡的地址
stringmac_addr;
for(inti=0;
i<
AdapterList.length-1;
++i)
if(GetAdapterInfo(AdapterList.lana[i],mac_addr))
cout<
<
Adapter"
<
int(AdapterList.lana[i])<
"
'
sMACis"
mac_addr<
endl;
cerr<
FailedtogetMACaddress!
Doyou"
havetheNetBIOSprotocolinstalled?
break;
return0;
file:
//---------------------------------------------------------------------------/
第二种方法-使用COMGUIDAPI
这种方法使用COMAPI创建一个GUID(全局唯一标识符)并从那里继承MAC地址。
GUID通常用来标识COM组件以及系统中的其他对象。
它们是由MAC地址(结合其他东西)计算得来的,表面上MAC地址就包含在其中。
我说表面上是因为事实上并没有包含。
我提供这种方法更多的是为了作为反面教材。
您也许用这种方法能够得到MAC地址,但有时候您只会得到随机的十六进制数值。
下面的例子十分简单,无需多讲。
我们使用CoCreateGuid创建GUID,并将最后六个字节放入字符串中。
它们可能是MAC地址,但并不是必然的。
uuid.cpp
conio.h>
MACaddressis:
//向COM要求一个UUID。
如果机器中有以太网卡,
//UUID最后的六个字节(Data4的2-7字节)应该是本地以太网卡的MAC地址。
GUIDuuid;
CoCreateGuid(&
uuid);
//Spittheaddressout
charmac_addr[18];
sprintf(mac_addr,"
uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],
uuid.Data4[5],uuid.Data4[6],uuid.Data4[7]);
getch();
第三种方法-使用SNMP扩展API
我要讨论的第三种方法是使用Windows的SNMP(简单网络管理协议)扩展来取得MAC地址。
在我的经验里,这个协议很简单。
代码也是直勾勾的向前的。
基本步骤和Netbios相同:
1》取得网卡列表
2》查询每块卡的类型和MAC地址
3》保存当前网卡
我个人对SNMP了解不多,但如我刚刚所言,代码十分清楚。
snmp.cpp
snmp.h>
typedefbool(WINAPI*pSnmpExtensionInit)(
INDWORDdwTimeZeroReference,
OUTHANDLE*hPollForTrapEvent,
OUTAsnObjectIdentifier*supportedView);
typedefbool(WINAPI*pSnmpExtensionTrap)(
OUTAsnObjectIdentifier*enterprise,
OUTAsnInteger*genericTrap,
OUTAsnInteger*specificTrap,
OUTAsnTimeticks*timeStamp,
OUTRFC1157VarBindList*variableBindings);
typedefbool(WINAPI*pSnmpExtensionQuery)(
INBYTErequestType,
INOUTRFC1157VarBindList*variableBindings,
OUTAsnInteger*errorStatus,
OUTAsnInteger*errorIndex);
typedefbool(WINAPI*pSnmpExtensionInitEx)(
voidmain()
HINSTANCEm_hInst;
pSnmpExtension
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 获取 网卡 MAC 地址
![提示](https://static.bdocx.com/images/bang_tan.gif)