众所周知,一个网卡对应唯一MAC地址,对一些应用程序来说,获取网卡MAC地址有时是必要的,使用VC提供的NetBIOS网络编程接口可以方便获取网卡MAC地址。NetBIOS

中所用的函数声明、常数等等均是在头文件nb30.h内定义的,nb30.h中一些类型在wtypes.h中定义,另外,若想使用NetBIOS,须连接的库是netapi32.lib。调用NetBIOS函数

时,使用uRetCode = netbios(&ncb)语句,其入口参数&ncb为指向一网络控制块(NCB)的指针。在该NCB结构中,包含了为执行一个NetBIOS命令相应需预先准备(在调用前)或

命令执行结果(在调用后)的全部信息,在调用NetBIOS函数前要先预置好该NCB结构中的一些有关字段;返回码uRetCode正常时应为0,返回的具体结果会包含在NCB结构的一些成

员中。

返回码uRetCode正常时应为0,返回的具体结果会包含在NCB结构的一些

字段中。NCB结构的定义如下:

typedef struct _NCB{

UCHAR  ncb_command; //用于指定要执行的NetBIOS命令, 一些常见的NetBIOS命令如附表所示。

            //命令可以有非异步(也称等待方式)和异步(也称非等待方式)两种方式执行:

            //将命令名和常量ASYNCH进行OR操作后的结果放入ncb_command则置为异

            //步(非等待)方式;若将命令名放入ncb_command则置为非异步(等待)方式。

            //在采用等待方式执行时,NetBIOS函数调用要等到该命令操作完成之后才返回执

            //行下一条语句。如果采用非等待(异步)方式执行,可以在调用NetBIOS前设置

            //ncb_post(后处理程序地址)或设置ncb_event(触发事件对象句柄),让NetBIOS

            //在完成命令后自动唤醒该后处理程序或触发相关事件,在采用异步方式时,

            //NetBIOS函数调用当场立即返回,执行下一条语句,并且带回“立即返回代码”

            //ncb_retcode,而当命令执行完时,又返回一个“最终返回代码”ncb_cmd_cplt,

            //你的程序可以根据这两个代码确定该命令是否成功执行。

UCHAR  ncb_retcode;   //用于指定操作的立即返回代码,若返回值为NRC_GOODRET(即0),表示

            //无立即差错

UCHAR  ncb_lsn;     //本地会话号。在使用面向连接的会话方式通信时,建立会话时,首先,两个站分别使

            //用增加名字命令NCBADDNAME或增加组名命令NCBADDGRNAME增加本站名

            //字,然后,一个站须发出NCBLISTEN命令,另一站发出NCBCALL命令,每一方

            //成功执行完命令,都会在NCB中返回一个本地会话号ncb_lsn,此后,两个站使用

            //NCBSEND、NCBRECV命令发送、接收数据时,都要在命令调用前在NCB中的

            //ncb_lsn字段赋值引用该本地会话号

CHAR   ncb_num;    //本地名字号。在使用无连接的数据报方式通信时,每次须先使用增加名字命令

            //NCBADDNAME或增加组名命令NCBADDGRNAME增加本站名,这时,NetBIOS

            //函数都会返回这个新增加的名字一个名字号。此后,两个站使用NCBDGSEND、

            //NCBDGRECV命令发送、接收数据报时,都要在命令调用前在NCB中的ncb_num

            //字段赋值引用该本地名字号

PUCHAR  ncb_buffer;   //指向数据缓冲区的指针。发送时,在NetBIOS函数调用前,该缓冲区中须放置要发

            //送的实际数据;接收时,为NetBIOS函数调用后返回的接收数据;对其他命令来说,

            //如NCBENUM,缓冲区中是NetBIOS函数调用后返回的预定义的结构LANA_ENUM

            //;对NCBSTAT命令来说,缓冲区里就是NetBIOS函数调用命令执行后逻辑网卡返

            //回的统计结果

WORD    ncb_length;    //指定缓冲区的长度,以字节数为单位,发送时为发送数据的字节数;接收时

             //NetBIOS会将该值设为实际收到的字节数,若指定的缓冲区不够大,NetBIOS会

            //返回 NRC_BUFLEND错误

UCHAR   ncb_callname[NCBNAMSZ];  //用于指定远方机器应用程序用的名字

UCHAR   ncb_name[NCBNAMSZ];     //用于指定本方机器应用程序用的名字

UCHAR  ncb_rto;             //规定接收操作时的会话超时时间(以0.5秒为单位)

UCHAR  ncb_sto;            //规定发送操作时的会话超时时间(以0.5秒为单位)

void (CALLBACK *ncb_post) (struct _NCB *);    //若使用异步命令(即非等待方式时),操作完成后调用

                              //的后处理程序地址

UCHAR  ncb_lana_num;  //指定LAN Adapter逻辑网卡号

UCHAR  ncb_cmd_cplt;   //完成操作后的最终返回代码,操作成功,正常返回NRC_GOODRET(即0);

            //若用异步操作,操作正进行期间NetBIOS会将这个值设为NRC_PENDING

UCHAR  ncb_reserve[10];   //保留,必须为0

HANDLE  ncb_event;    //事件对象的句柄。当一个异步命令被接受时,事件对象被置为不发信号状态,

             //当该异步命令完成时,事件对象被置为发信号状态,当NetBIOS函数返回非0值

             //时也会发信号给事件。ncb_command为非异步(等待)方式时或ncb_post非

            //0时,该ncb_event应为0

}NCB, *PNCB;

nb30.h中还定义了另外一个很重要的结构LANA_ENUM,当主机中有两块以上逻辑网

卡(一物理网卡绑定某一协议为一逻辑网卡)时,使用NCB命令NCBENUM后(该命令只

能在Windows NT/2000/XP中使用),该结构中会含有返回的逻辑网卡个数及每个逻辑网卡

号,该结构的定义如下: typedef struct  LANA_ENUM {

UCHAR  length;                      //系统中含有的逻辑网卡个数

UCHAR  lana [MAX_LANA];          //数组中放各个逻辑网卡号

} LANA_ENUM, *PLANA_ENUM;

其中: lana [MAX_LANA]定义了一个存放所有逻辑网卡信息的数组,length表示该数组的

长度,即为本机所带逻辑网卡的个数。

此外,我们还要定义一个描述网卡的结构ASTAT,其中使用了结构

ADAPTER_STATUS(也由nb30.h定义):

typedef struct

{

ADAPTER_STATUS  adapt;

NAME_BUFFER     NameBuff[30];

} ASTAT;

其中的ADAPTER_STATUS结构为 typedef struct _ADAPTER_STATUS {

UCHAR   adapter_address[6];   //网卡MAC地址

UCHAR   rev_major;

UCHAR   reserved0;

UCHAR   adapter_type;

UCHAR   rev_minor;

WORD    duration;

WORD    frmr_recv;

WORD    frmr_xmit;

WORD    iframe_recv_err;

WORD    xmit_aborts;

DWORD   xmit_success;

DWORD   recv_success;

WORD    iframe_xmit_err;

WORD    recv_buff_unavail;

WORD    t1_timeouts;

WORD    ti_timeouts;

DWORD   reserved1;

WORD    free_ncbs;

WORD    max_cfg_ncbs;

WORD    max_ncbs;

WORD    xmit_buf_unavail;

WORD    max_dgram_size;

WORD    pending_sess;

WORD    max_cfg_sess;

WORD    max_sess;

WORD    max_sess_pkt_size;

WORD    name_count;

} ADAPTER_STATUS, *PADAPTER_STATUS; 在调用

netbios NCBASTAT命令前,我们可将指向ADAPTER_STATUS结构的指针

值赋给缓冲区指针ncb.ncb_buffer,

ASTAT  Adapter;

ncb.ncb_buffer = (unsigned char *) &Adapter;  //

两个指针指向同一个地方

ncb.ncb_length = sizeof(Adapter);            //

设置ncb_buffer缓冲区长度

这样在执行NCBASTAT命令后,由于ncb.ncb_buffer指针所指的缓冲区中为命令执行

后逻辑网卡返回的统计结果(其中包含MAC网卡地址、一组有关网络负荷和差错的统计数

字、网卡所在工作站的名字表以及每个名字对应的状态信息等),我们使用与其同一地址的

ADAPTER_STATUS结构的adapter_address[6]字段便可取出其中的网卡地址。

有几点说明如下:

1.由于ncb_command字段用于指定要执行的netbios命令,在执行一个netbios函数调用

前应先赋值ncb_command字段,另外,还要设置NCB中一些与该命令相关的字段:

(1)首先,我们要获取当前计算机有多少个逻辑网卡,可用以下一段代码来实现: NCB  ncb;                  //

网络控制块

LANA_ENUM  lana_enum;    //该结构包含系统中的逻辑网卡数目及每个逻辑网卡号

memset(&ncb, 0, sizeof(ncb) );  //NCB结构清零

ncb.ncb_buffer=(unsigned char *)&lana_enum;

ncb.ncb_length=sizeof(lana_enum);

ncb.ncb_command = NCBENUM;  //枚举系统逻辑网卡命令

UCHAR uRetCode = Netbios(&ncb);  //uRetCode返回0为正确返回;非0为出错返回

int num = lana_enum.length;     //读出返回的逻辑网卡个数 (

2)然后,如果对第一块逻辑网卡进行初始化(复位)可用以下代码实现:

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

ncb.ncb_command = NCBRESET;  //初始化逻辑网卡命令

ncb.ncb_lana_num = lana_enum.lana[0];   //第一块逻辑网卡号

uRetCode = Netbios(&ncb );

(3)此后,如查询第一块逻辑网卡包括MAC地址等在内的信息可用以下代码实现:

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

ncb.ncb_command = NCBASTAT;          //对逻辑网卡统计信息命令

ncb.ncb_lana_num = lana_enum.lana[0];   //第一块逻辑网卡号

strcpy((char*)ncb.ncb_callname,"*              "+0x0);

// ncb_callname

中要设置netbios调用时对方使用的名字,*表示不限定,这里

//用来表示要对本机统计信息。netbios中使用的名字由16个字节组成,前15个

//字节为ASCII码,若不满,要用空格填满。这里最后一字节为NULL(0x0) ASTAT  Adapter;

ncb.ncb_buffer = (unsigned char *) &Adapter;

ncb.ncb_length = sizeof(Adapter);

uRetCode = Netbios(&ncb);

……      //对返回结果中的网卡

MAC地址等部分进行提取处理

2.通常进行任何NetBIOS调用之前,不要一开始就填写结构内的各个成员,而应将这个

NCB结构清零。 清零可用memset(&NCBobject, 0, sizeof(NCBobject) )语句实现。

3. 另外,如需使用NetBIOS调用Netbios(&ncb)进行数据发送、接收时,调用前,在ncb

结构中的各成员参数须先行设置:ncb_buffer中放数据块内容,ncb_length放数据块长度,

ncb_callname中放远方欲通信的机器应用名字,ncb_name中为本方机器应用名,

ncb_lana_num中放本方发送或接收使用的逻辑网卡号,发送或接收的过程,根据采用面向

连接的会话通信方式还是无连接的数据报通信方式的不同,其过程步骤也不一样,见下图

所示,其它祥细参数设置与编程细节可参考相关的MSDN帮助文档。

2010-04-27 22:13

error LNK2001: unresolved external symbol _Netbios@4

在调用Netbios( )方法的时候发送如下错误:

error LNK2001: unresolved external symbol 

fatal error LNK1120: 1 unresolved externals

原因:程序中缺少lib文件

在project->setting里的link中Object/library modules,在文本框中,

加入Netapi32.lib 即可

关于NetBios的简单应用相关推荐

  1. 利用NetBIOS名称与其他计算机通信

    当某台计算机与网络中的其他计算机通信时,它是如何依据对方的计算机名称来得知其IP地址呢?名称解析的方法有以下几种: 检查NetBIOS名称缓存(NetBIOS name cache) 广播 直接向WI ...

  2. 浅谈netbios及其相关内容

    Netbios想必大家都有接触.对于netbios的理解,我以前有很多困惑,不知道如何掌握这些知识点,这几天通过了一段时间的实验和学习,有了一些体会,和大家一起分享. 阅读本文,你可以了解到以下内容 ...

  3. DHCP服务器禁用NetBios功能后引发WPAD失效解决方法

    今天的这篇博文呢,只是想把最近遇到在DHCP服务器上禁用NetBios选项后导致的Windows XP SP3版本无法正常应用WPAD值的问题. 关于禁用客户端的Netbios选项功能的方法,微软官方 ...

  4. TCP/IP协议中的一些常用端口简单讲解

    (源自http://bbs.360.cn/3232114/17010996.html) 那么TCP/IP协议中的端口指的是什么呢?如果把IP地址比作一间房子 ,端口就是出入这间房子的门.真正的房子只有 ...

  5. 域netbios名什么意思_域渗透(二):域环境搭建

    "究竟爱一个人,可以到什么程度?究竟什么样的邂逅,可以舍命不悔?逻辑的尽头不是理性和秩序的理想国,而是我用生命奉献的爱情!<嫌疑人X的献身>"01环境简介 在本篇文章中 ...

  6. Win2003环境下简单的安全配置

    Win2003 Server的安全性较之Win2K确实有了很大的提高,但是用Win2003 Server作为服务器是否就真的安全了?如何才能打造一个安全的个人Web服务器?下面我们简单介绍一下 一.W ...

  7. [转载]关于NETBIOS理清楚概念的文章

    有关网上邻居的问题,问的人一直比较多,在理解上存在的误区也普遍较为严重.鉴于Microsoft的NETBIOS文档不是很细致,我四处收集了一些相关资料加上自己的实践经验写了这个系列,希望能对大家有所帮 ...

  8. SYSTEM32 下的几乎所有文件的简单说明

    [转帖]SYSTEM32 下的几乎所有文件的简单说明 aclui.dll .....Security Descriptor Editor,没有它,注册表编缉器会无法运行 ACTIVEDS.DLL .. ...

  9. NetBIOS 漏洞的入侵与防御

    1. 漏洞描述 NetBIOS 即Network Basic Input Output System(网络基本输入输出系统),是一种应用程序接口(API), 系统可以利用W I N S 服务.广播及L ...

最新文章

  1. 数据库字段属性配置工具界面[用于代码生成]
  2. 帝国cms搜索php分页,帝国cms V7.2自定义分页(列表分页,内容分页)样式步骤
  3. 领域应用 | 偷偷告诉你,那些二次元萌妹都有个叫知识图谱的爸爸
  4. GitHub 版本控制 项目托管 04 创建GitHub远程仓库
  5. 【常见Web应用安全问题】---1、Cross Site Scripting
  6. SpringBoot Idea快速创建工程
  7. Web测试实践——每日例会记录12.30(1)
  8. python归一化函数_机器学习-归一化方法
  9. 读react.js小书 01
  10. 2. 贯穿软件开发生命周期的测试
  11. 索尼笔记本笔记本计算机在哪里设置,索尼vaio笔记本怎么进bios设置|索尼笔记本进bios按什么键...
  12. 网络协议学习(B站观看最多)
  13. Java 小数保留小数位数的方法
  14. java根据内容生成二维码
  15. 小米路由器微信连接到服务器,小米路由器怎么设置微信好友免密码直接链接上网?...
  16. 《Getting Real中文版》读书笔记
  17. GNS3-GREvpn
  18. 同步消息和异步消息的区别
  19. 喜马拉雅下载器使用手册
  20. HDMI 2.1特性

热门文章

  1. lvs集群实现lvs-dr模型和lvs-nat模型
  2. 在网页中实现图片的轮播
  3. java warmup,20. dubbo源码-预热warmup过程
  4. springboot+电影售票小程序 毕业设计-附源码201532
  5. exit()和_exit()两个函数的区别
  6. 工厂设计模式 - 详解
  7. Word2Vec--词向量模型
  8. 使用机器学习来预测股票价格
  9. 462 字节 C 代码实现雅虎 logo ACSII 动画
  10. Linux浏览器无法访问网络解决方案