NetBios 编程参考手册文档格式.docx
- 文档编号:18320247
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:68
- 大小:47.99KB
NetBios 编程参考手册文档格式.docx
《NetBios 编程参考手册文档格式.docx》由会员分享,可在线阅读,更多相关《NetBios 编程参考手册文档格式.docx(68页珍藏版)》请在冰豆网上搜索。
数据报方式或会话方式。
数据报是一种短信息,它既可被传送给具有唯一名的工作站,也可传送给共享一个组名的一组工作站;
它的大小可由NetBIOS的执行程序改变但不保证信息准确有序地送到接收方,数据报信息的准确性需要程序员在程序中进行检验。
DOS下数据报的最大长度是512字节,Windows下为1,024字节。
会话是两个应用程序之间一种可靠的数据传送方式,属于点对点通信。
与数据报相比,会话方式的主要优点是接收方系统要把信息接收状态送交到发送方系统,发送方系统根据信息接收状态确定信息是否重发,从而可以保证数据的准确性,整个过程由NetBIOS系统完成,不需要人工干涉。
然而,会话的可靠性是以建立会话、维护会话、微机之间数据包应答的开销为代价,增加了网络负担。
2.3NetBIOS非等待方式
NetBIOS命令分为等待方式与非等待方式两种类型。
等待方式是指该命令被接受时,程序被挂起,该命令完成后程序才继续执行。
这种方式保证了数据安全完整地到达目的,同时也保证了通信软件本身执行的安全可靠,编程较为简单,在一些实时性要求不高的系统中使用起来即方便又可靠。
非等待方式实际上是命令驻留内存方式,主程序执行不受到影响,等到NetBIOS认为“适当的时候”,执行所驻留的命令,完成相应的任务。
NetBIOS设计者这样设计非等待方式,为了在处理通信任务时,保证主程序不必等待通信功能调用完成以后才执行其它的工作,而可直接继续工作下去。
通信功能利用某个时间“间隙”完成,这样大大提高了通信的效率,从而满足了系统的实时性
3.NetBios接口
3.1概述
NetBios层提供的是会话层服务,其实现称为NetBios驱动程序。
但是,如果只有这些驱动程序或NetBios层本身,并不能实现通信。
若想实现通信,NetBios层的客户机应当访问NetBios提供的服务具体访问可经由程序设计接口完成。
NetBios提供了一系列标准的程序设计接口,应用程序可以利用这些接口在局域网间进行通信。
大多数局域网软件商(例如Microsoft,IBM和Novell)都提供具有这些接口的NetBios驱动程序。
因为这些接口事实上已成了标准,所以,将基于NetBios的应用程序从一个局域网软件环境不加修改或稍加修改地移至另一个局域网软件环境中运行是可行的。
再说一遍,支持这些接口是NetBios驱动程序的义务,由NetBios驱动程序负责将每一个NetBios接口调用转换成相应的一个或多个NetBios的协议包。
下面按照它们所提供的服务分类介绍一下NetBios接口。
说明一下,这里所说的实体是指,利用NetBios接口同其他实体(包括本身)进行通信的任何处理,或关联着NetBios名的任何处理。
NetBios名是个16字节域,多余部分用空格(20H)填充或用NULL(00H)填充,但一定要统一。
3.2命令服务
NetBios为在网络上增加、删除、查找已命名NetBios实体提供了相应的接口。
任何NetBios实体都可通过NetBiosAddName(增加名)接口使自己同一个NetBios名关联起来,该名在整个网络中具有唯一性。
比如说,注册进入网络的每一个用户通常都有一个唯一的NetBios名,以便彼此之间能够区分开来。
同时,一个实体可以登记成一个组名的一部分,多个实体可以将它们自己同这个组名相关联。
例如,某一公司财务科的所有会计可以共享一个组名(或称别名),如“ACCOUNTS”,其后,发往该组名的消息将同时发往所有会计。
当然,每一个会计还可有一个唯一的名(如注册ID或用户ID),以便发送和接收其个人消息。
15个字符的计算机名是在网络中用于标识这台计算机的唯一名字,它是在计算机的“标识(Identity)”栏中由用户指定的。
用户指定的计算机名最多占15个字符,当少于15个字符时便自动以空格或用NULL(00H)补足15个字符。
用户指定的计算机名可以使用的字符有:
数字0~9,不分大小写的英文字母,特殊字符“~、!
、@、#、$、%、^、&
、*、(、)、-、`、{、}、.”,在可见字符之间还可以有空格。
名字实际上的区分大小写的,建议将名字全部转换成大写。
其中的限制有:
“*”不能用于名字开始,“*”保留用于广播地址,不能以“IBM”三个字母开头等。
不过,如果希望NetBIOS计算机名在DNS(InternetDomainNameSystem)中也有效的话,NetBIOS计算机名中就不要使用非法的DNS字符:
“.”、“@”、空格、下划线、不能以数字开始等,这可参见微软知识库Q154554
3.3会话服务
NetBios为创建、破坏或使用设置在任二个NetBios实体之间的会话提供了一系列接口。
若想使用会话管理工具,NetBios实体首先应当通过AddName接口将自己同一个唯一名关联起来。
在两个实体间设置了会话后,他们可以使用各自喜好的Send和Receive接口发送和接收数据缓冲区,缓冲区最大可达128KB-2字节=131070字节。
大多数NetBios应用程序都利用这些服务来发送和接收数据包。
3.4数据表(数据报)服务
NetBios提供了一系列接口,来发送和接收称为数据表(datagram)的数据包。
并不能保证数据表一定能成功地发送和接收,NetBios只是简单地尽其最大的能力发送和接收实体所提供的数据表。
数据表最大可有64KB-1字节=65535字节长。
可发送给一个实体,也可以广播方式了送给网络中所有实体。
3.5杂务服务
为获取安装在结点上的网络适配器卡的状态和动态复位适配器提供了相应的接口,它还为取消实体先前发出的命令提供了相应的接口。
4.NetBios程序设计
4.1概述
前面根据OSI模型讨论了一般的网络规则以及NetBios提供的服务,还介绍了NetBios提供的网络应用程序可用来进行网络通信的大量接口(由NetBios驱动程序实现),这里,再介绍一下如何在Windows应用程序中使用这些接口。
NetBios程序设计中最容易混淆的是,并不是每个NetBios接口都有一个API函数,取而代之的是,Windows只提供了一个函数(NETBIOSCALL),这个函数以一个数据结构作为输入,虽然数据结构中的字段是固定的,但程序设计人员可以通过一个特定字段−−称为命令字段−−的值,来表明想使用哪一个NetBios服务。
DOS下的NetBios调用则是通过调用Int5Ch来实现,具体方法如下:
1.Win32VC6Netbios(PNCB*ncb)//Usesnetapi32.lib
2.DOSBC31DOS_NetBios(PNCB*ncb)
{
unionREGSinregs,outregs;
structSREGSsregs;
sregs.es=FP_SEG((struct_NCBfar*)pncb);
//把NCB的段地址赋予寄存器ES
inregs.x.bx=FP_OFF((struct_NCBfar*)pncb);
//把NCB的偏移量赋予寄存器BX
int86x(0x5c,&
inregs,&
outregs,&
sregs);
//调用0x5c中断,请求NetBIOS调用
returnpncb->
ncb_retcode;
}
调用结果在函数返回值和ncb->
ncb_retcode中返回。
4.2调用命令的数据结构
下面列出数据结构中的诸字段,说明每一个字段的含义,最后还要讨论一下NetBios命令的异步和同步执行。
typedefstruct_NCB
unsignedcharncb_command;
//1byte,commandcode
unsignedcharncb_retcode;
//1byte,returncode
unsignedcharncb_lsn;
//1byte,localsessionnumber
unsignedcharncb_num;
//1byte,numberofournetworkname
unsignedchar*ncb_buffer;
//4byte,addressofmessagebuffer
unsignedshortncb_length;
//2byte,sizeofmessagebuffer
unsignedcharncb_callname[16];
//16byte,blank-paddednameofremote
unsignedcharncb_name[16];
//16byte,ourblank-paddednetname
unsignedcharncb_rto;
//1byte,rcvtimeout/retrycount
unsignedcharncb_sto;
//1byte,sendtimeout/systimeout
void(*ncb_post)(structNCB*);
//4byte,POSTroutlineaddress
unsignedcharncb_lana_num;
//1byte,lana(adapter)number
unsignedcharncb_cmd_cplt;
//1byte,0xff=>
commandpending
unsignedcharncb_reserve[14];
//10byte,reserved,usedbyBIOS
//HANDLEncb_event;
//4byte,HANDLEtoWin32event,whichwillbesettothesignalledstate,whenanASYNCHcommand
}NCB,*PNCB;
这个结构共64个字节,使用前一般应清零。
最后的两行在DOS下与Win16,Win32有一点区别:
DOS下的定义如上所示;
Win16下reserver字段为12个字节,HANDLE占两个字节
Win32下reserver字段为10个字节,HANDLE占四个字节
ncb_command字段
每一个发往NetBios的NCB都代表一项要执行的动作,具体执行哪项动作,由ncb_command字段的取值决定。
NetBios命令的使用方式有两种,即同步和异步,同步命令将阻止提交处理的执行,直到该命令执行完毕。
而异步命令由NetBios在内部排队,并不阻止执行。
命令执行完后,最终的返回码存放在NCB结构的ncb_cmd_cplt字段中。
ncb_retcode字段
命令提交给NetBios驱动程序后,该命令的成功与否即在该字段中反映出来。
若ncb_retcode字段值为00h,则表示命令成功。
对于异步NetBios命令NetBios将立即在ncb_retcode字段中返回值FFh,表明该命令已经排队,即将执行。
命令执行完毕后,同ncb_cmd_cplt一样,ncb_retcode将置成最终的返回码。
ncb_lsn字段
同远程应用程序处理建立了会话后,NetBios驱动程序将相应设置该字段(局部会话号)。
在随后的通信中,若想同远程处理进行通信,本地处理只需在NCB结构中指明局部会话号,不再需要在ncb_callname字段中指定完整的远程处理逻辑名。
单就一个适配器而言,工作站上和每一个处理一次至多能进行254个会话,只要指定相关的局部会话号,就能达到会话的目的。
系统保留值0和255,不将它们作为局部会话号使用。
ncb_num字段
工作站上的每一个处理最多可向名表中加进254个逻辑名。
成功地将一名加进局域网适配器的私有名表后,NetBios将置ncb_num字段值成该名在名表中的索引值(索引值称为名号),在以后的同远程处理进行的非连接式通信中,可使用这个名号。
名号0和255亦为系统保留,适配器的物理地址总在名表第1项(例如Name_Number=1)中。
NetBios下此字段的值是由1不断增加,最大为254,然后再到1,但永远也不会为0和255。
ncb_buffer字段
该字段的值是,要发送的数据缓冲区的地址,或者要在其中存放接收到的数据的缓冲区的地址。
此字段为4字节,在Win32下为一个字符型指针,DOS下应定义为far型字符指针。
ncb_length字段
ncb_length字段指定的是,由ncb_buffer字段指定的缓冲区的长度。
接收到一块数据时,NetBios将相应设置该字段。
ncb_callname字段
这是一个由应用程序设置的16字节字段,其值是远程处理的逻辑名。
应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。
所有的字节均有用。
在远程驱动程序连接正期待着接收连接呼叫的本地处理时,NetBios将填写该字段。
因此,接收呼叫的处理能够找出远程呼叫方的名。
此字段和ncb_name字段中的多余字节部分填充字符应一致,即都用空格或00H填充。
ncb_name字段
这是由应用程序设置的16字节字段,其值是本地处理的逻辑名,应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。
该字段的第一个字节不能是二进制0或“*”,另外,IBM保留了头三个字节,所以头三个字节不能是“IBM”。
第16个字节不能是00h到1Fh之间的值。
在局域网管理器环境下,最后一个字节(即第16个字节)有特殊的含义,具体如下:
最后一个字节含义
20h服务器名
00h重定向名
03h用户名
05h转寄名
ncb_rto字段
在期望从一个或数个远程处理接收到一包时,应用程序可在ncb_rto(接收时间限制)字段中指定等待的最大时间。
若超过了指定时间仍未接收到包,则NetBios驱动程序将在ncb_retcode字段中返回错误。
若ncb_rto字段值为00h,则表示阻止执行,直到本地处理接收到一包。
ncb_sto字段
ncb_sto(发送时间限制)字段类似于ncb_rto字段,但它指定的是等待NetBios连接式命令,Send,完成的时间。
若超过了指定时间,则将返回错误。
若ncb_sto字段值为00h,则表示不为发送操作指定时间限制。
此时,命令将阻止执行,直到要么成功地发送了一包,要么NetBios层停止了重试。
ncb_post字段
在提交异步命令时,应用程序可以设置该字段。
在MS-DOS中,应用程序将后处理例程的地址填在该字段中。
所谓后处理例程,即命令执行完毕后NetBios驱动程序将要调用的例程。
Windows下为一个指向回调函数的指针,DOS下为一个指向中断函数据的函数型指针。
定义为如下形式:
Win32VC6:
void(CALLBACK*ncb_post)(struct_NCB*);
DOSBC31:
void(*ncb_post)(structNCB*);
ncb_lana_num字段
因为一台工作站上可能有不止一个局域网网络适配器卡,所以,NCB中相应也有一个字段,用来指明应用程序想使用哪一个网络适配器。
该字段称为LAN适配器号或LANA号,LANA号从0开始。
在像MicrosoftLANManager这样的网络软件环境中,可以同时装入多个传输驱动程序(例如,TCP/IP,NetBios或XNS),其中每一个驱动程序都提供了一个NetBios接口。
另外,一台工作站可能有不止一个LAN适配器卡,此时,ncb_lana-number字段指定的是某一特定对,即应用程序想使用的传输驱动程序和LAN适配器卡。
NT4.0下可以为协议指定一个lana_num,而Win98下则是动态配置的。
为了简单起见,在使用中,可将NetBios协议设为默认的通讯协议,而lana_num相应的固定为0(后面的示例中即采用这种方法)。
ncb_cmd_cplt字段
NetBios驱动程序利用该字段来表明异步命令已完成。
起先,当应用程序提交一条异步命令时,NetBios将置该字段值为FFh。
待命令执行完毕后,再将最终值填入该字段。
也就是说,提交了一条异步命令后,应用程序可以监视(轮询)该字段的取值,直到其值不再是FFh为止。
提交一个NCB
若想使用Windows提供的NETBIOSCALL函数,则应当从类似于图所示的汇编语言代码段中调用该函数的关键是,在远程调用NETBIOSCALL之前,要先将NCB结构的地址进入寄存器对ES:
BX。
这同在MS-DOS环境下提交NCB不同。
在MS-DOS环境下提交NCB,是通过调用INT5C或INT2A实现的。
当然,NCB结构的地址也要送入ES:
弄清楚提交上去的NCB是如何导致一包或数包被送至网络,以及NetBios是如何适应OSI模型的,总是有益的。
图示出了各自利用NETBIOSCALL来发送和接收包的发送方和接收方。
4.3同步NetBios命令与异步NetBios命令
所有的NetBios命令都可同步执行,并且大多数命令亦能异步执行。
图示出了NetBios命令及其在NCB.H中定义的代码。
NetBios命令描述同步代码异步代码
NCBRESET复位32h不允许
NCBASTAT适配器状态33hB3h
NCBCANCEL取消35h不允许
NCBUNLINK取消链接70h不允许
NCBADDNAME加入名称30hB0h
NCBDELNAME删除名称31hBih
NCBADDGRNAME加入组名36hB6h
NCBFINDNAME寻找名称78HF8H
NCBCALL呼叫10h90h
NCBLISTEN侦听11h91h
NCBHANGUP挂起12h92h
NCBSEND发送14h94h
NCBRECV接收15h95h
NCBRECVANY全部接收16h96h
NCBCHAINSEED链发送17h97h
NCBCHAINSENDNA链发送(无回应)72hF2h
NCBSSTAT状态34hB4h
NCBDGSEND发送数据20hA0h
NCBDGRECV接收数据21hA1h
NCBDGSENDBC发送广播22hA2h
NCBDGRECVBC接收广播23hA3h
实际上,异步命令的只是把命令字段的最高位置为1,即同步命令+80H=异步命令。
提交了一条同步命令处理将不再执行,直到所提交的同步命令执行完毕。
而提交了一条异步命令的处理在等待这条命令执行完毕的同时还可以继续执行其他任务。
具体使用哪一种命令,主要取决于手头要执行的任务及应用程序的性质。
但是,在使用同步命令时要小心,特别是在命令完成时间不可确定的情况下。
若在这种情况下使用同步命令,则应用程序将挂起。
这种情况的害处在基于MS-DOS的系统中尤其明显,因为此时在命令执行完毕前不能进行任何其他活动。
而windows环境下,将阻止用户切换进其他应用程序。
也就是说,如果使用不小心的话,同步命令将导致应用程序对用户不友好。
如,同步调用一个数据接收命令,如果Netbios未收到一个数据包,则程序一直等待。
虽然可以设置接收超时的限置,但超时是以1/2秒为单位进行等待的,我在使用时对超时的设置效果也不理想。
下面讨论一下异步命令的提交方式。
为了进行异步调用,NCB命令应当同80hsh相或。
另外,在命令执行完毕之前,所提交的NCB不应当被破坏或释放,因此建议定义全局的接收和发送以及其它操作的三个单独变量。
必要的话,可通过NCB结构的ncb_rto和ncb_sto字段指定适当的超时限制。
NCB命令执行完毕或超时后,NetBios驱动程序将相应设置NCB结构的ncb_retcode和ncb_cplt字段。
提交后,异步命令可能立即完成。
在这种情况下,NetBios驱动程序将设置ncb_retcode和ncb_cmd_cplt字段,NetBios调用将立即返回。
NCB提交后立即进行的NCB处理,如果发现了错误,则将采取相同的处理,ncb_retocode字段值即为返回码。
如果上述情况都没有发生,则NetBios驱动程序将把所提交的NCB在内部队列中排队,等待以后执行,并在ncb_retcode和ncb_cmd_cplt字段中返回FFh。
可通过两种途径等待步命令执行完毕。
第一种是在提交NCB时将ncb_post字段值置成FFh。
此时,应用程序可以轮询NCB是否已执行完,具体方法就是查看ncb_cmd_cplt字段的取值。
命令完成(成功、失败或超时)后,NetBios驱动程序将把最终的返回码填写在ncb_cmd_cplt字段中,最终的返回码决不会是FFh。
第二种途径是,在提交NCB之前,先将后处理例程的地址送入NCB结构的ncb_post字段。
在这种情况下当命令完成(成功、失败或超时)时,NetBios将调用该例程。
后处理例程是NetBios驱动程序在中断时要调用的应用程序的一部分,因此,在NCB处理完成之前,代码应当留在同样的内存单元中。
4.4命令调用详解
Win32下命令的调用参数中都可以设ncb_event事件,具体方法请参考MSDN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NetBios 编程参考手册 编程 参考手册