VC++中怎样读取网卡的MAC地址

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 等 其 他 程 序 中 调 用。

 
 
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

xiezhsh

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值