zoukankan      html  css  js  c++  java
  • 如何用VC++开发读取网卡MAC地址的程序

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

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

    ---- 请运行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 < nb30.h >
    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< lana_enum.length; ++i)
    getmac_one( lana_enum.lana[i]);
    }
    return 0;
    }

    ---- 此时,按F7编译、直至通过,按F5运行即可。
    ---- 这段代码可以直接嵌入相关的应用系统之中,或封装成.DLL或COM控件,以便可以在Visual Basic、Visual Foxpro、Power Builder或Delphi等其他程序中调用  

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1779428

  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2422141.html
Copyright © 2011-2022 走看看