netbios编程
N e t B I O S扩展用户接口(NetBIOS Extended User Inte易做图ce, NetBEUI)他同NETBOIS接口一起构成了一个完整的协议,对应OSI七层模式,NETBOIS主要工作在会话层和传输层。
NETBOIS似的编程接口与协议无关,根据NETBOIS规范设计的应用程序能在TCP/IP,NETBOIS甚至IPX/SPX上运行,但通信双方应最少安装一种两者通用的协议。切NETBEUI是非可路由的,所以要想在网络中使用,必须依靠一种可路由的协议.
LANA编号
其中LANA0是默认的LANA.
每个L A N A编号对应于网卡及传输协议的唯一组合。例如,假定某工作站安装了两张网卡,
以及两种具有N e t B I O S能力的传输协议(如T C P / I P和N e t B E U I),那么总共就有四个L A N A编
号。下面是一种对应关系的例子:
0 . T C P / I P—网卡1
1 . N e t B E U I—网卡1
2 . T C P / I P—网卡2
3 . N e t B E U I—网卡2
NETBOIS名字
对一个进程(或“应用”、“应用程序”)来说,它会注册自己希望与其通信的每个L A N A编号。一
个N e t B I O S名字长度为1 6个字符,其中第1 6个字符用于特殊的用途,(如微软的NETBOIS名字的最后一个字符用于区分不用的网络服务)在名字表内添加一个名字时,应将名字缓冲区初始化成空白。在Wi n 3 2环境中,针对每个可用的L A N A编号,每个进程都会为其维持一张N e t B I O S名字表。若为LANA 0增添一个名字,意味着你的应用程序只能在LANA 0上同客户机建立连接。对每个L A N A来说,能够添加的名字的最大数量是2 5 4,编号从1到2 5 4(0和2 5 5由系统保留)
N e t B I O S名字共有两种类型:唯一名字和组名。组名主要是用于广播
唯一名字标识符
第1 6个字节含义
< 0 0 > 工作站服务名。通常,它对应于N e t B I O S计算机名
< 0 3 > 收发消息时采用的信使服务名。W I N S服务器会将这个名字注册成W I N S客户机上
的信使服务,并通常追加到计算机名后面,以及当前登录到计算机的用户名的后面
< 1 B > 域主控浏览器名。这个名字用于标识主域控制器,并指出用什么客户机和其他浏
览器同域主控浏览器取得联系
< 0 6 > 远程访问服务(R A S)服务器服务
< 1 F > 网络动态数据交换( N e t D D E)服务
< 2 0 > 用于为文件共享提供“共享点”的服务器服务名
< 2 1 > R A S客户机
< B E > 网络监视器代理
< B F > 网络监视器工具
组名标识符
< 1 C > 一个域组名,在这个组内包含了已注册域名的一系列计算机的特定地址。由域控
制器来注册这个名字。W I N S将它当作一个域组看待:组内每个成员必须单独更新
自己的名字。域组最多只能包容2 5个名字。若复制的一个静态1 C名字同另一个
W I N S服务器上的某个动态1 C名字发生冲突,便会增加成员的一个“联合”,同时将
记录标定为“静态”。假如记录是静态的,组内成员便不必定时刷新自己的I P地址
< 1 D > 指定一个主控浏览器的名字,客户机通过它访问主控浏览器。在一个子网上,只
能有一个主控浏览器。W I N S服务器会对域名注册作出“正”(肯定)响应,但却
不会将域名保存在自己的数据库中。假如一台计算机向W I N S服务器送出一个域名
查询,则W I N S服务器会返回一个“负”(否定)响应。若送出域名查询的那台计
算机已被配置成h节点或m节点,便会随之广播那个查询,以解析出正确的名字。
客户机解析名字的方法是由节点的类型决定的。如客户机配置成b节点解析,便会
送出广播包,以便广告并解析出N e t B I O S名字。p节点解析采用与W I N S服务器的点
到点通信方式。而m节点属于b及p节点的一种混合形式:首先使用的是b节点;如
有必要,再接着使用p节点。最后一种解析方式是h节点,亦称“混合模式”。它无
论如何都会先尝试使用p节点注册和解析,然后只有在解析失败的前提下,才会换
用b节点。Wi n d o w s操作系统默认为h节点
< 1 E > 一个普通组名。浏览器可向这个名字发送广播数据,并通过对它的监听来挑选一
个主控浏览器。这些广播面向的是本地子网,绝对不应通过路由器传输
< 2 0 > 一个I n t e r n e t组名。这种类型的名字由W I N S服务器进行注册,以便为了管理方面
的目的来标定特定的计算机组。例如,“p r i n t e r s g”可以是一个注册的组名,用于
标定由打印服务器构成的一个管理性组
_ M S B R O W S E _ 不再是单独一个追加的第1 6位字符,“_ M S B R O W S E _”需要追加到一个域名后面,并在本地子网上进行广播,向其他主控浏览器通告这个新增的域
NETBOIS特征
NETBOIS同时提供了面向连接的和无连接的服务,它允许两个客户机相互间建立一个会话,它允许双方互相发送信息。
NETBOIS编程
UCHAR Netbios(PNCB pNCB);
NCB结构成员字段定义
n c b _ c o m m a n d 指定要执行的N e t B I O S命令。许多命令都可同步或异步与A S Y N C H ( 0 X 8 0 )标志以及命令进行按位O R(或)运算
n c b _ r e t c o d e f 指定操作的返回代码。在一个异步操作进行期间,函数会将该值设为N R C _ P E N D I N G
n c b _ l s n 对应一个本地会话编号,与当前环境内的一次会话有着唯一对应的关系。成功执行了一次N C B C A L L或N C B L I S T E N命令后,函数会返回一个新的会话编号
n c b _ n u m 指定本地名字的编号。伴随N C B A D D N A M E或N C B A D D G R N A M E命令的每一次
调用,都会返回一个新编号。针对所有数据报命令,都必须使用一个有效的编号
n c b _ b u ff e r 指向数据缓冲区。对那些需要发送数据的命令,该缓冲区包含了要送出的实际数
据;而对那些需要接收数据的命令,则包含了要从N e t b i o s函数返回的数据。对其他命令来说,如N C B E N U M,缓冲区便是预定义的结构L A N A _ E N U M
n c b _ l e n g t h 以字节数为单位,指定缓冲区的长度。对于接收命令来说, N e t b i o s会将该值设为
收到的字节数。若指定的缓冲区不够大, N e t b i o s就会返回N R C _ B U F L E N错误
n c b _ c a l l n a m e 指定远程应用的名字
n c b _ n a m e 指定应用程序已知的名字
n c b _ r t o 设定接收操作的超时期限。该值应设为5 0 0毫秒的一个整数倍数。若为1,表示没
有超时限制。该值是为N C B C A L L和N C B L I S T E N命令设置的,它们会影响后续的N C B R E C V命令
n c b _ s t o 设定发送操作的超时期限。该值应设为5 0 0毫秒的一个整数倍数。若为1,表示不
存在超时限制。该值是为N C B C A L L和N C B L I S T E N命令设置的,它们会影响后续的N C B S E N D和N C B C H A I N S E N D命令
n c b _ p o s t 指定异步命令完成后需要调用的后例程的地址。函数定义为:void CALLBACK PostRoutine(PNCB pncb);其中,p n c b指向已完成命令的网络控制块
n c b _ l a n a _ n u m 指定要在上面执行命令的L A N A编号
n c b _ c m d _ c p l 指定操作的返回代码。异步操作进行期间,Netbios会将这个值设为NRC_PENDING
n c b _ r e s e r v e 保留;必须为0
n c b _ e v e n t 指定设置为“未传信”(N o n s i g n a l e d)状态的一个Wi n d o w s事件对象的句柄。完成一个异步命令后,事件便会设置成它的“传信”(S i g n a l e d)状态。只应使用人工重设事件。假若n c b _ c o m m a n d未设置A S Y N C H标志,或者n c b _ p o s t不为0,那么该字段必须为0。否则, N e t b i o s会返回N R C _ I L L C M D错误
调用N e t b i o s函数时,可选择进行同步调用,还是进行异步调用。所有N e t B I O S命令本身
均是同步的。换言之,完成命令以前,会一直调用N e t b i o s块。而对一个N C B L I S T E N命令来
说,当有一个客户机建立了连接,或发生某种类型的错误时,对N e t b i o s的调用才会返回。要
想异步调用一个命令,需要让N e t B I O S命令同A S Y N C H标志进行一次逻辑O R(或)运算。如
指定了A S Y N C H标志,那么必须在n c b _ p o s t字段中指定一个后例程(Post Routine),或必须在n c b _
e v e n t字段中指定一个事件句柄。执行一个异步命令时,从N e t b i o s返回的值是N R C _ G O O D R E T
( 0 x 0 0 ),但n c b _ c m d _ c p l t字段会设为N R C _ P E N D I N G ( 0 x F F )。除此以外, N e t b i o s函数还会将
N C B结构的n c b _ c m d _ c p l t字段设为N R C _ P E N D I N G(待决),直到命令完成为止。命令完成后,
n c b _ c m d _ c p l t字段会设为该命令的返回值。N e t b i o s也会在完成后将n c b _ r e t c o d e字段设为命令
的返回值。
typedef struct LANA_ENUM
{
UCHAR length;
UCHAR lana[MAX_LANA+1];
}LANA_ENUM,*PLANA_ENUM;
l e n g t h成员指出本地机器共有多少个L A N A编号。l a n a字段代表由实际的L A N A编
号构成的一个数组。而l e n g t h值指出l a n a数组内有多少个元素会被填充L A N A编号。
NETBOIS简单测试程序,检测网卡地址.
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "string.h"
#include "nb30.h"
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER namebuffer[30];
}ASTAT;
int main(int argc, char* argv[])
{
ASTAT adapter;
NCB ncb;
UCHAR retcode;
LANA_ENUM lenum;
int i;
memset(&ncb,0,sizeof(NCB));
ncb.ncb_command=NCBENUM;
ncb.ncb_buffer=(UCHAR*)&lenum;
ncb.ncb_length=sizeof(lenum);
retcode=Netbios(&ncb);
for (i=0;i<lenum.length;i++)
{
memset(&ncb,0,sizeof(NCB));
ncb.ncb_command=NCBRESET;
ncb.
补充:综合编程 , 其他综合 ,