学习代码

// Win32Project1.cpp : Defines the entry point for the console application.
//netbios是VC提供的网络编程接口,可以方便的获取网卡MAC地址,netbios中所用的函数声明、常数等均是在头文件nb30.h内定义的,若想使用netbios,必须连接netapi32.lib库
#include "stdafx.h"

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <wincon.h>
#pragma comment(lib,"netapi32.lib")
/*
Dev C++ -> include libnetapi32.a
BCC 5.5 or VC++ -> #pragma comment(lib,"netapi32.lib")
*/


//定义一个描述网卡的结构 _ASTAT_ ,其中使用到了ADAPTER_STATUS结构(也由nb30.h定义),
typedef struct _ASTAT_
{
    ADAPTER_STATUS adapt;                //该结构内定义了网卡MAC地址的变量
    NAME_BUFFER NameBuff[30];
} ASTAT, *PASTAT;

void getMac(char * mac)
{
    ASTAT Adapter;
    NCB Ncb;
    UCHAR uRetCode;                        //定义返回值变量,在调用betbios函数前应先预置好该NCB的一些字段,返回码uRetCode正常时应为0
    LANA_ENUM lenum;                    //LANA_ENUM结构是有nb30.h中定义的,当主机中有两块以上网卡时,使用NCB命令NCBENUM后该结构会含有返回的网卡数目及其索引;
                                        //LANA_ENUM结构中定义了一个lana [MAX_LANA] 数组,它存放所有网卡信息;同时该结构中还有一个length变量,表示lana数组的长度,也就是本机所带网卡的个数
    int i = 0;

    memset(&Ncb, 0, sizeof(Ncb));

    Ncb.ncb_command = NCBENUM;            //用于指定要执行的Netbios命令

    Ncb.ncb_buffer = (UCHAR *)&lenum;    //指向数据缓冲区,发送时该缓冲区包含了要送出去的实际数据,接收时的接收数据则为从Netbios函数返回的数据;
                                        //对于其他命令来说,如NCBENUM,缓冲区便是预定义结构LANA_ENUM

    Ncb.ncb_length = sizeof(lenum);        //指定缓冲区的长度,以字节数为单位,接收时netbios会将该值设为收到的字节数,若指定的缓冲区不够大,netbiod就会返回NRC_BUFLEND错误
                                        //该句的意思是将求出的网卡数量赋值给Ncb.ncb_length


    //调用netbios函数,入口参数是一个指向网络控制块(NCB)的指针
    uRetCode = Netbios(&Ncb);
    printf("The NCBENUM return adapter number is: %d \n ", lenum.length);
    for (i = 0; i < lenum.length; i++)
    {
        memset(&Ncb, 0, sizeof(Ncb));    //NCB结构清零
        Ncb.ncb_command = NCBRESET;
        Ncb.ncb_lana_num = lenum.lana[i];
        uRetCode = Netbios(&Ncb);

        memset(&Ncb, 0, sizeof(Ncb));
        Ncb.ncb_command = NCBASTAT;
        Ncb.ncb_lana_num = lenum.lana[i];
        strcpy_s((char *)Ncb.ncb_callname,30, "* ");
        Ncb.ncb_buffer = (unsigned char *)&Adapter;
        Ncb.ncb_length = sizeof(Adapter);
        uRetCode = Netbios(&Ncb);

        if (uRetCode == 0)
        {
            //sprintf(mac, "%02x-%02x-%02x-%02x-%02x-%02x ",
            sprintf_s(mac,30, "%02X%02X%02X%02X%02X%02X ",
                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]
                );
            //printf( "The Ethernet Number on LANA %d is: %s\n ", lenum.lana[i], mac);
        }
    }
}

int main(int argc, char *argv[])
{
    char *mac = new char[32];
    getMac(mac);
    printf("%s\n ", mac);
    delete[]mac;
    system("PAUSE> NUL ");
    return 0;
}

转载于:https://my.oschina.net/SecCode/blog/1541355

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值