欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
VC++中怎样读取网卡的MAC地址
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 

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< pre>

----此 时, 按F7 编 译, 按F5 运 行 即 可。

----这 段 代 码 可 以 直 接 嵌 入 相 关 的 应 用 系 统 之 中, 或 封 装 成.DLL 或COM 控 件, 以 便 可 以 在Visual Basic、Visual Foxpro、Power Builder 或Delphi 等 其 他 程 序 中 调 用。

 
 

附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步