VC++中怎样读取网卡的MAC地址
文/温卫江
在 实 际 的 应 用 系 统 中, 我 们 往 往 会 需 要 在 程 序 运 行 时 获 取 当 前 机 器 的 网 卡 的MAC 地 址, 以 便 作 为 某 种 标 识 之 用, 如 控 制 程 序 的 合 法 性 等。 下 文 介 绍 如 何 用Microsoft Visual C + + 6.0 开 发 这 样 的 程 序。
----这 里 采 用 的 方 法 是 通 过Windows 9x/NT/Win2000 中 内 置 的NetApi32.DLL 的 功 能 来 实 现 的。 首 先 通 过 发 送 NCBENUM 命 令, 获 取 网 卡 的 数 目 和 每 张 网 卡 的 内 部 编 号, 然 后 对 每 个 网 卡 标 号 发 送NCBASTAT 命 令 获 取 其MAC 地 址。 注 意: 这 里 的 网 卡 是 指 捆 绑 了NetBEIU 协 议 的 通 信 协 议 栈, 可 以 在 网 卡 的 属 性 处 查 看 到。
----请 运 行VC + +, 打 开 一 个 新 的 工 程, 选 择 创 建 一 个Win32 Console 程 序, 然 后 按 下 文 输 入 代 码, 并 请 参 见 其 中 的 注 释:
#include “stdafx.h" #include #include #include #include #include // 因 为 是 通 过NetAPI 来 获 取 网 卡 信 息, 所 以 需 要 包 含 其 题 头 文 件nb30.h #include typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; }ASTAT, * PASTAT; ASTAT Adapter; // 定 义 一 个 存 放 返 回 网 卡 信 息 的 变 量 // 输 入 参 数:lana_num 为 网 卡 编 号, 一 般 地, 从0 开 始, 但 在Windows 2000 中 并 不 一 定 是 连 续 分 配 的 void getmac_one (int lana_num) { NCB ncb; UCHAR uRetCode; memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = lana_num; // 指 定 网 卡 号 // 首 先 对 选 定 的 网 卡 发 送 一 个 NCBRESET 命 令, 以 便 进 行 初 始 化 uRetCode = Netbios( &ncb ); printf( “The NCBRESET return code is: 0x %x \n", uRetCode ); memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = lana_num; // 指 定 网 卡 号 strcpy((char *)ncb.ncb_callname,“ * " ); ncb.ncb_buffer = (unsigned char *) &Adapter; // 指 定 返 回 的 信 息 存 放 的 变 量 ncb.ncb_length = sizeof(Adapter); // 接 着, 可 以 发 送NCBASTAT 命 令 以 获 取 网 卡 的 信 息 uRetCode = Netbios( &ncb ); printf( “The NCBASTAT return code is: 0x %x \n", uRetCode ); if ( uRetCode == 0 ) { // 把 网 卡MAC 地 址 格 式 化 成 常 用 的16 进 制 形 式, 如0010 -A4E4 -5802 printf( “The Ethernet Number[ %d] is: %02X %02X - %02X %02X - %02X %02X\n", lana_num, Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5] ); } } int main(int argc, char * argv[]) { NCB ncb; UCHAR uRetCode; LANA_ENUM lana_enum; memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (unsigned char *) &lana_enum; ncb.ncb_length = sizeof(lana_enum); // 向 网 卡 发 送NCBENUM 命 令, 以 获 取 当 前 机 器 的 网 卡 信 息, 如 有 多 少 个 网 卡、 每 张 网 卡 的 编 号 等 uRetCode = Netbios( &ncb ); printf( “The NCBENUM return code is: 0x %x \n", uRetCode ); if ( uRetCode == 0 ) { printf( “Ethernet Count is : %d\n\n", lana_enum.length); // 对 每 一 张 网 卡, 以 其 网 卡 编 号 为 输 入 编 号, 获 取 其MAC 地 址 for ( int i=0; i
----此 时, 按F7 编 译, 按F5 运 行 即 可。
----这 段 代 码 可 以 直 接 嵌 入 相 关 的 应 用 系 统 之 中, 或 封 装 成.DLL 或COM 控 件, 以 便 可 以 在Visual Basic、Visual Foxpro、Power Builder 或Delphi 等 其 他 程 序 中 调 用。
本文地址:http://com.8s8s.com/it/it3078.htm