会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
技术文档 > VC文档 > 网络通讯
读取网卡的MAC地址
发表日期:2003-05-28 00:00:00作者: 出处:  

---- 在 实 际 的 应 用 系 统 中, 我 们 往 往 会 需 要 在 程 序 运 行 时 获 取 当 前 机 器 的 网 卡 的MAC 地 址, 以 便 作 为 某 种 标 识 之 用, 如 控 制 程 序 的 合 法 性 等。 下 文 介 绍 如 何 用Microsoft Visual C + + 6.0 开 发 这 样 的 程 序。

----这 里 采 用 的 方 法 是 通 过Windows 9x/NT/Win2000 中 内 置 的NetApi32.DLL 的 功 能 来 实 现 的。 首 先 通 过 发 送 NCBENUM 命 令, 获 取 网 卡 的 数 目 和 每 张 网 卡 的 内 部 编 号, 然 后 对 每 个 网 卡 标 号 发 送NCBASTAT 命 令 获 取 其MAC 地 址。 注 意: 这 里 的 网 卡 是 指 捆 绑 了NetBEIU 协 议 的 通 信 协 议 栈, 可 以 在 网 卡 的 属 性 处 查 看 到。

----请 运 行VC + +, 打 开 一 个 新 的 工 程, 选 择 创 建 一 个Win32 Console 程 序, 然 后 按 下 文 输 入 代 码, 并 请 参 见 其 中 的 注 释:

#include “stdafx.h"

#include <WINDOWS.H>

#include <WINCON.H>

#include <STDLIB.H>

#include <STDIO.H>

#include <TIME.H>

// 因 为 是 通 过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 等 其 他 程 序 中 调 用。

返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00394