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

原创 2001年08月23日 10:06:00

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

 
 

VC 获取物理网卡的MAC地址

获取网卡的MAC地址的方法很多,如:Netbios,SNMP,GetAdaptersInfo等。经过测试发现 Netbios 方法在网线拔出的情况下获取不到MAC,而 SNMP方法有时会获取多个重复的...
  • kingepoch
  • kingepoch
  • 2014年04月19日 14:23
  • 1836

VC++ 获取mac地址

原文链接:http://www.cnblogs.com/SteveCheung/archive/2012/07/18/2597449.html 1 // MacAddress....
  • huasonl88
  • huasonl88
  • 2015年12月12日 12:23
  • 1652

vb取网卡Mac地址代码

[程序语言] Microsoft Visual Basic 4.0,5.0,6.0[运行平台] WINDOWS[源码来源] http://support.microsoft.com/support/k...
  • QQ1854520
  • QQ1854520
  • 2006年10月31日 22:42
  • 1222

C++ 硬件信息 获取网卡MAC地址

获取计算机网卡MAC地址的方法很多,这里采用的是命令行的形式获取,可以获取有线网卡与无线网卡的MAC地址,很简单,直接 上代码。 【1】头文件 #if !defined(AFX_95644697_...
  • aoshilang2249
  • aoshilang2249
  • 2014年11月02日 13:04
  • 2577

VC之获取计算机网卡mac地址

网卡的物理地址即mac地址全球唯一,占用六个字节。(正规厂家的网卡mac地址全球唯一,盖因有统一的委员会进行分配,一般前3个字节为生产厂商ID,后三个字节为产品子ID.mac地址一般烧写在网卡的pro...
  • yishi88
  • yishi88
  • 2013年09月06日 20:04
  • 2640

vc 获取本机网卡真实mac地址

vc 获取本机网卡真实mac地址
  • bennyyang
  • bennyyang
  • 2016年12月16日 12:54
  • 1458

请问如何在内核中得到网卡的mac地址?根据网卡名子得到mac地址也可

ww7109(stranger)04-08-23 14:10 请问如何在内核中得到网卡的mac地址?根据网卡名子得到mac地址也可 回复 文章选项:       dl_dht(addict)0...
  • ryman
  • ryman
  • 2005年04月24日 15:48
  • 3067

VB获取网卡MAC地址代码

Option ExplicitPrivate Const NCBASTAT = &H33Private Const NCBNAMSZ = 16Private Const HEAP_ZERO_MEMOR...
  • wjb9921
  • wjb9921
  • 2009年12月25日 04:47
  • 1933

C++之获取网卡物理地址(MAC)

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include   //该头文件定义了Socket编程的功能  ...
  • pbl18392021230
  • pbl18392021230
  • 2017年05月24日 09:44
  • 795

linux 获取eth0(指定网卡)网卡的IP地址(或MAC地址)

引言 使用场景: 我使用的Linux服务器上有多个网卡,有时候就需要在脚本中使用到指定网卡的IP地址或MAC地址,那么这个时候就有两种做法,一是预先读取网卡的IP地址或MAC地址,然后写入到脚本...
  • wang93IT
  • wang93IT
  • 2017年09月13日 20:13
  • 372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++中怎样读取网卡的MAC地址
举报原因:
原因补充:

(最多只允许输入30个字)