通过netbios来获取mac值

来源:互联网 发布:js怎么判断分页 编辑:程序博客网 时间:2024/06/01 11:14

memset大多用来初始化

sprintf字符串格式化命令



#include <windows.h>

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#pragma comment(lib,"netapi32.lib")
/*
Dev C++ -> include libnetapi32.a
BCC 5.5 or VC++ -> 
*/
 
typedef struct _ASTAT_
{
    ADAPTER_STATUS adapt;
    NAME_BUFFER NameBuff [30];
} ASTAT, *PASTAT; //定义一个网卡的结构体 
 
void getMac(char * mac)
{
    ASTAT Adapter;
    NCB Ncb;//NCB结构代表了网络控制块。它包含有关该命令来执行,可选的后置程序中,一个可选的事件句柄,和一个指针,用于消息或其他数据的缓冲器信息。一个指向这个结构被传递到NetBIOS功能。
    UCHAR uRetCode;
    LANA_ENUM lenum;//结构包含当前LAN适配器的数量。
    int i = 0;
 
    memset(&Ncb, 0, sizeof(Ncb));//使用之前要使ncb结构清0, memset大多用来初始化
    Ncb.ncb_command = NCBENUM;//统计系统中网卡的数量 指定指令为NCBENUM,用于获取网卡的数量及编号  向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,每个网卡的编号(MAC地址)
    Ncb.ncb_buffer = (UCHAR *)&lenum; //ncb_buffer成员指向由 LANA_ENUM结构填充的缓冲区  指定返回的信息存贮内存;指向消息缓冲区。该缓冲区必须具有写入权限
    Ncb.ncb_length = sizeof(lenum);// 指定消息缓冲区的大小,以字节为单位。用于接收命令,该构件是由NetBIOS的功能,指示接收到的字节数。 如果缓冲区长度不正确时,NetBIOS函数返回NRC_BUFLEN错误代码。
    uRetCode = Netbios( &Ncb );//向网卡查询来获取网卡的信息


    printf( "The NCBENUM return adapter number is: %d \n ", lenum.length);//leum.length指定有效条目的LAN适配器编号的​​数组中的号码
    for(i=0; i < lenum.length ; i++)
    {
        memset(&Ncb, 0, sizeof(Ncb));//使用之前要使ncb结构清0
        Ncb.ncb_command = NCBRESET;//对选定的网卡发送命令,以便进行初始化
        Ncb.ncb_lana_num = lenum.lana[i];//指定网卡号 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化
        uRetCode = Netbios( &Ncb );//向网卡查询来获取网卡的信息
 
        memset(&Ncb, 0, sizeof(Ncb));//使用之前要使ncb结构清0
        Ncb.ncb_command = NCBASTAT; //设定查询指定网卡,用NCBASTAT获取网卡的信息
        Ncb.ncb_lana_num = lenum.lana[i];//指定网卡号
        strcpy((char *)Ncb.ncb_callname, "* ");//很重要  指定返回信息的存储内存,strcpy(char* dest, const char *src):把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
                                      //ncb_callname指定了远程应用程序的名称
        Ncb.ncb_buffer = (unsigned char *) &Adapter;//指定消息缓冲区的大小,以字节为单位。用于接收命令,该构件是由NetBIOS的功能,指示接收到的字节数。 如果缓冲区长度不正确时,NetBIOS函数返回NRC_BUFLEN错误代码。
        Ncb.ncb_length = sizeof(Adapter);//指定消息缓冲区的大小
        uRetCode = Netbios( &Ncb );//向网卡查询来获取网卡的信息
 
        if (uRetCode == 0)//调用成功
        {
            //sprintf(mac, "%02x-%02x-%02x-%02x-%02x-%02x ",
            sprintf(mac, "%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]
                   );//字符串格式化命令,把数据按常用十六进制格式输出,X 表示以十六进制形式输出;02 表示不足两位,前面补0输出;
            //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;

}





0 0