




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NetBios 编程参考手册(初稿)1. 概述NetBios是PC机网络中用得最为广泛的网络协议之一,大多数的局域网(LAN)产品,如Microsoft LAN Manager,Novell NetWare和Banqan Vines都支持NetBios。因此,将NetBios作为网络协议的优点是:基于NetBios网络应用程序并不需修改便能在其它各种网络环境下运行,用户将享受到极大的灵活性,既使改用了其它网络也能继续使用原先的应用程序,避免了重复投入。1984年8月,Sytek公司推出了为IBM第一个局域网IBM-PC Network所使用的管理程序NetBIOS。1985年10月,IBM推出它的另一个局域网IBM Token-Ring时,使用了功能增强了的NetBIOS,称为NetBEUI。NetBIOS在国际标准化组织(ISO)开放系统互联(OSI)七层参考模型中处于较高的层次,如下图所示,所以编写NetBIOS接口应用程序基本上与其它层无关,这使得NetBIOS的应用在各种各样的通讯环境中基本上都可以移植。由于NetBIOS应用的广泛可移植性,且直观简单,以致NetBIOS在各种操作系统环境中迅速推广,如DOS、OS/2、UNIX等。当Microsoft推出其Windows系列时,一直把NetBIOS作为其主要的网络通信协议。以下对NetBIOS的使用作基本介绍。ISO/OSI参考模型2. NetBIOS的功能简介21概述NetBIOS提供了三种基本服务:名字服务、数据报服务、会话服务。应用程序通过调用三种服务中的相应控制命令,就能实现多机间,甚至单机内不同应用程序间的通讯。22 名字服务为了保证通讯时信息能从信源机到达目的机,网上各工作站必须有相应的名字来证明自己的身份以及识别对方。工作站使用的名字可以有多个的,但在使用某个名字之前,必须在局域中申请使用该名字的权利。申请的名字有两种:唯一名和组名。如果名字是唯一名,那么,局域网中其它工作站就不能使用这个名字,否则名字注册会失败;如果名字是组名,那么其它工作站就不能把这个名字注册为唯一名,并且局域网中任何工作站都可以同时注册这个组名。23 数据报及会话服务各工作站中的应用程序可以通过NetBIOS与驻留在相同或不同工作站中的应用程序进行通讯。通信的方式有两种:数据报方式或会话方式。数据报是一种短信息,它既可被传送给具有唯一名的工作站,也可传送给共享一个组名的一组工作站;它的大小可由NetBIOS的执行程序改变但不保证信息准确有序地送到接收方,数据报信息的准确性需要程序员在程序中进行检验。DOS下数据报的最大长度是512字节,Windows下为1,024字节。会话是两个应用程序之间一种可靠的数据传送方式,属于点对点通信。与数据报相比,会话方式的主要优点是接收方系统要把信息接收状态送交到发送方系统,发送方系统根据信息接收状态确定信息是否重发,从而可以保证数据的准确性,整个过程由NetBIOS系统完成,不需要人工干涉。然而,会话的可靠性是以建立会话、维护会话、微机之间数据包应答的开销为代价,增加了网络负担。23 NetBIOS非等待方式 NetBIOS命令分为等待方式与非等待方式两种类型。等待方式是指该命令被接受时,程序被挂起,该命令完成后程序才继续执行。这种方式保证了数据安全完整地到达目的,同时也保证了通信软件本身执行的安全可靠,编程较为简单,在一些实时性要求不高的系统中使用起来即方便又可靠。 非等待方式实际上是命令驻留内存方式,主程序执行不受到影响,等到NetBIOS认为“适当的时候”,执行所驻留的命令,完成相应的任务。NetBIOS设计者这样设计非等待方式,为了在处理通信任务时,保证主程序不必等待通信功能调用完成以后才执行其它的工作,而可直接继续工作下去。通信功能利用某个时间“间隙”完成,这样大大提高了通信的效率,从而满足了系统的实时性3. NetBios接口31概述NetBios层提供的是会话层服务,其实现称为NetBios驱动程序。但是,如果只有这些驱动程序或NetBios层本身,并不能实现通信。若想实现通信,NetBios层的客户机应当访问NetBios提供的服务具体访问可经由程序设计接口完成。NetBios提供了一系列标准的程序设计接口,应用程序可以利用这些接口在局域网间进行通信。大多数局域网软件商(例如Microsoft,IBM和Novell)都提供具有这些接口的NetBios驱动程序。因为这些接口事实上已成了标准,所以,将基于NetBios的应用程序从一个局域网软件环境不加修改或稍加修改地移至另一个局域网软件环境中运行是可行的。再说一遍,支持这些接口是NetBios驱动程序的义务,由NetBios驱动程序负责将每一个NetBios接口调用转换成相应的一个或多个NetBios的协议包。下面按照它们所提供的服务分类介绍一下NetBios接口。说明一下,这里所说的实体是指,利用NetBios接口同其他实体(包括本身)进行通信的任何处理,或关联着NetBios名的任何处理。NetBios名是个16字节域,多余部分用空格(20H)填充或用NULL(00H)填充,但一定要统一。32命令服务NetBios为在网络上增加、删除、查找已命名NetBios实体提供了相应的接口。任何NetBios实体都可通过NetBios Add Name(增加名)接口使自己同一个NetBios名关联起来,该名在整个网络中具有唯一性。比如说,注册进入网络的每一个用户通常都有一个唯一的NetBios名,以便彼此之间能够区分开来。同时,一个实体可以登记成一个组名的一部分,多个实体可以将它们自己同这个组名相关联。例如,某一公司财务科的所有会计可以共享一个组名(或称别名),如“ACCOUNTS”,其后,发往该组名的消息将同时发往所有会计。当然,每一个会计还可有一个唯一的名(如注册ID或用户ID),以便发送和接收其个人消息。15个字符的计算机名是在网络中用于标识这台计算机的唯一名字,它是在计算机的“标识(Identity)”栏中由用户指定的。用户指定的计算机名最多占15个字符,当少于15个字符时便自动以空格或用NULL(00H)补足15个字符。用户指定的计算机名可以使用的字符有:数字09,不分大小写的英文字母,特殊字符“、!、#、$、%、&、*、(、)、-、.”,在可见字符之间还可以有空格。名字实际上的区分大小写的,建议将名字全部转换成大写。其中的限制有:“*”不能用于名字开始,“*”保留用于广播地址,不能以“IBM”三个字母开头等。不过,如果希望NetBIOS计算机名在DNS(Internet Domain Name System)中也有效的话,NetBIOS计算机名中就不要使用非法的DNS字符:“.”、“”、空格、下划线、不能以数字开始等,这可参见微软知识库Q15455433会话服务NetBios为创建、破坏或使用设置在任二个NetBios实体之间的会话提供了一系列接口。若想使用会话管理工具,NetBios实体首先应当通过Add Name接口将自己同一个唯一名关联起来。在两个实体间设置了会话后,他们可以使用各自喜好的Send和Receive接口发送和接收数据缓冲区,缓冲区最大可达128KB-2字节=131070字节。大多数NetBios应用程序都利用这些服务来发送和接收数据包。34数据表(数据报)服务NetBios提供了一系列接口,来发送和接收称为数据表(datagram)的数据包。并不能保证数据表一定能成功地发送和接收,NetBios只是简单地尽其最大的能力发送和接收实体所提供的数据表。数据表最大可有64KB-1字节=65535字节长。可发送给一个实体,也可以广播方式了送给网络中所有实体。35杂务服务为获取安装在结点上的网络适配器卡的状态和动态复位适配器提供了相应的接口,它还为取消实体先前发出的命令提供了相应的接口。4NetBios程序设计41概述前面根据OSI模型讨论了一般的网络规则以及NetBios提供的服务,还介绍了NetBios提供的网络应用程序可用来进行网络通信的大量接口(由NetBios驱动程序实现),这里,再介绍一下如何在Windows应用程序中使用这些接口。NetBios程序设计中最容易混淆的是,并不是每个NetBios接口都有一个API函数,取而代之的是,Windows只提供了一个函数(NETBIOSCALL),这个函数以一个数据结构作为输入,虽然数据结构中的字段是固定的,但程序设计人员可以通过一个特定字段 称为命令字段 的值,来表明想使用哪一个NetBios服务。DOS下的NetBios调用则是通过调用Int 5Ch来实现,具体方法如下:1 Win32 VC6 Netbios(PNCB *ncb) /Uses netapi32.lib2 DOS BC31 DOS_NetBios(PNCB *ncb)union REGS inregs,outregs;struct SREGS sregs;sregs.es=FP_SEG(struct _NCB far*)pncb); /把NCB的段地址赋予寄存器ESinregs.x.bx=FP_OFF(struct _NCB far*)pncb); /把NCB的偏移量赋予寄存器BXint86x(0x5c,&inregs,&outregs,&sregs); /调用0x5c中断,请求NetBIOS调用return pncb-ncb_retcode;调用结果在函数返回值和ncb-ncb_retcode中返回。42调用命令的数据结构下面列出数据结构中的诸字段,说明每一个字段的含义,最后还要讨论一下NetBios命令的异步和同步执行。typedef struct _NCB unsigned char ncb_command; / 1 byte, command code unsigned char ncb_retcode; / 1 byte, return code unsigned char ncb_lsn; / 1 byte, local session number unsigned char ncb_num; / 1 byte, number of our network name unsigned char *ncb_buffer; / 4 byte, address of message buffer unsigned short ncb_length; / 2 byte, size of message buffer unsigned char ncb_callname16; /16 byte, blank-padded name of remote unsigned char ncb_name16; /16 byte, our blank-padded netname unsigned char ncb_rto; / 1 byte, rcv timeout/retry count unsigned char ncb_sto; / 1 byte, send timeout/sys timeout void (*ncb_post) (struct NCB *); / 4 byte, POST routline address unsigned char ncb_lana_num; / 1 byte, lana (adapter ) number unsigned char ncb_cmd_cplt; / 1 byte, 0xff=command pending unsigned char ncb_reserve14; /10 byte, reserved, used by BIOS /HANDLE ncb_event; / 4 byte, HANDLE to Win32 event,which will be set to the signalled state,when an ASYNCH command 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下为一个指向中断函数据的函数型指针。定义为如下形式:Win32 VC6:void (CALLBACK *ncb_post)( struct _NCB * ); DOS BC31:void (*ncb_post) (struct NCB *);ncb_lana_num字段因为一台工作站上可能有不止一个局域网网络适配器卡,所以,NCB中相应也有一个字段,用来指明应用程序想使用哪一个网络适配器。该字段称为LAN适配器号或LANA号,LANA号从0开始。在像Microsoft LAN Manager这样的网络软件环境中,可以同时装入多个传输驱动程序(例如,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,是通过调用INT 5C或INT 2A实现的。当然,NCB结构的地址也要送入ES:BX。弄清楚提交上去的NCB是如何导致一包或数包被送至网络,以及NetBios是如何适应OSI模型的,总是有益的。图示出了各自利用NETBIOSCALL来发送和接收包的发送方和接收方。43同步NetBios命令与异步NetBios命令所有的NetBios命令都可同步执行,并且大多数命令亦能异步执行。图示出了NetBios命令及其在NCB.H中定义的代码。NetBios命令 描述 同步代码 异步代码NCBRESET 复位 32h 不允许NCBASTAT 适配器状态 33h B3hNCBCANCEL 取消 35h 不允许NCBUNLINK 取消链接 70h 不允许NCBADDNAME 加入名称 30h B0hNCBDELNAME 删除名称 31h BihNCBADDGRNAME 加入组名 36h B6hNCBFINDNAME 寻找名称 78H F8HNCBCALL 呼叫 10h 90hNCBLISTEN 侦听 11h 91hNCBHANGUP 挂起 12h 92hNCBSEND 发送 14h 94hNCBRECV 接收 15h 95hNCBRECVANY 全部接收 16h 96hNCBCHAINSEED 链发送 17h 97hNCBCHAINSENDNA 链发送(无回应) 72h F2hNCBSSTAT 状态 34h B4hNCBDGSEND 发送数据 20h A0hNCBDGRECV 接收数据 21h A1hNCBDGSENDBC 发送广播 22h A2hNCBDGRECVBC 接收广播 23h A3h实际上,异步命令的只是把命令字段的最高位置为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处理完成之前,代码应当留在同样的内存单元中。44命令调用详解Win32下命令的调用参数中都可以设ncb_event事件,具体方法请参考MSDN 中的NETBIOS部分,DOS下不能设置,以下各个命令中都将这个参数省略了。441复位 NCBRESET功能:清除NetBIOS名字和会话表并中断任何现有的会话,从而复位指定的适配器。参数:ncb_command = NCBRESETncb_lsn = 会话号ncb_num = 本地名字编号ncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码说明:Reset命令也将下一有效的LSN值、NcbNum值分别设置成01h、02h。Reset命令是否关闭和重新打开适配器,由IBM LAN支持程序CLOSE.ON.RESET(CR)参数而定。如果该参数定义为NO,则NetBIOS不关闭适配器,完整无缺地留下所有现有的DLC通信工具。如果CLOSE.ON.RESET参数指定为Yes,则关闭并重新打开适配器,中断现有的DLC通信。如果RESET.VALUES参数指定为Yes,每种情况如下:n 当在NcbLsn域定义的会话数为零时,缺少的最大会话数目由IBM LAN支持程序SESSIONS参数决定,而不是通常的缺少值6。n 当在NcbNum域定义的命令数目为零时,挂起的最多命令数的缺少值由IBM LAN支持程序COMMANDS值决定而不是通常的缺少值12。n 否则RESET.VALUES参数定义为NO,将NcbLsn值和SESSIONS值中的较少者定义为最大会话数目来复位适配器。命令数目的最大值被定义为NcbNum值与COMMANDS参数中的较少者。注意Token-Ring适配器重新复位网络通信及统计,PC网络适配器则不用。442适配器状态 NCBASTAT功能:要求获得本地或远程适配器状态参数:ncb_command = NCBASTATncb_buffer = 输出缓冲区ncb_lenth = 输出缓冲区长度(min = 60Byte)ncb_callname = 名字ncb_post = ?后置例程(回调函数)ncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_lenth = 信息长度ncb_cmd_cplt = 异步执行返回码说明:ncb_lana_num 如果NETBIOS设为默认协议,则此字段为0,通信双方的协议一定要一致。ncb_callname 确定从哪个适配器获取状态,此域可以是永久结点名,组名和唯一名。如果指定为*,则返回本地NETBIOS状态。443取消 NCBCANCEL功能:取消一个NETBIOS命令,它的NCB地址由ncb_buffer指定。参数:ncb_command = NCBCANCELncb_buffer = 待取消命令的NCB地址ncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码说明:虽然你可以取消Send No Ack 及 Chain Send No ack 命令,而且不用中断它们相应的会话。但是取消挂起的Send 或 Chain Send 命令总是中断它们各自的会话。不能取消下列NETBIOS命令Add Group NameAdd NameCancelDelete NameResetSend DatagramSend Broadcart DatagramSession Status Unlink444取消链接 NCBUNLINK功能:拆除链接参数:ncb_command = NCBUNLINKncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码说明:Unlink命令提供同原来的PC网络LANA NetBIOS的兼容性,PC Network LANA NetBIOS用Unlink拆除与RPL服务器的连接。对Unlink命令而言,NcbLanaNum唯一有效值是00h。可能出现值1h,但这仅因为NetBIOS在处理时疏忽没有拒绝此值。如果把Unlink命令用于原始的PC Network LANA适配器且RPL是被激活的,那么NetBIOS接着用位于高段内存的内部Ncb以等待选项方式调用内部的Hang Up命令。因为NetBIOS RPL的活动独自使用主适配器,所以此Ncb的NcbLanaNum域值为00h。另一方面,适配器可能为中原始PC Network LANA适配器或是原始的PC Network LANA适配器,但没有被激活的RPL。这种情况下,不对RPL会话Hang Up命令,但将此命令作为空操作处理,简单地返回成功的返回码。在任何情况下,实际上00h总是作为指定了有效NcbLnanNum值的Hang Up命令的返回码。445加入名称 NCBADDNAME功能:将一个唯一名加到适配器的NetBIOS命令表中参数:ncb_command = NCBADDNAMEncb_name =名字(唯一)ncb_lana_num = 协议名ncb_post =后置例程(回调函数)输出:ncb_retcode = 返回码ncb_num = 名字序号ncb_cmd_cplt = 异步执行返回码说明:Add Name命令将一个唯一名加到适配器的NetBIOS命令表中,名字长为16个字符。这是辩认适配器的名字,它在整个网上必须唯一。NetBIOS通过重复广播网络名字查询来处理此命令。在早期的IBM PC机上,如果在CONFIG.SYS的DXMT0MOD.SYS TRANSMIT.TIMEOUT参数确定的期限内,没有收到对名字查询请示的应答,那么要再次广播名字查询信息,重复广播的次数为TRANSMIT.COUNT。如果仍然还没有应答,NetBIOS假设名字唯一,将其作为唯一名加到本地NetBIOS命令表中。446删除名称 NCBDELNAME功能:从NETBIOS命名表中删除一个16字符的名字参数:ncb_command = NCBDELNAMEncb_name = 待删除的名字ncb_post = ?后置例程(回调函数)ncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码说明:删除一个正用于某会话的名字时,撤销此名字后才能完成此命令。命令的返回码0FH 表示此名字正用于活动会话。在这种情况下,实际的名字删除工作将被延迟,它在适配器的NETBIOS命名表中仍占有一个登记项,直到与此名字相关的所有会话由Hang Up 命令中断面关闭后才删除它。撤销的名字在后面的NETBIOS CALL 及LISTEN 命令中不能再使用。现存的会话的SEND 和RECEIVE 命令继续运行,直到会话结束,但数据报命令不能再使用此名字。如果调用Delete Name 命令时,名字仅与挂起的非活动的会话命令相关,则删除该名字同时给用户返回命令已完成的状态。挂起的非活动会话命令立即终止,返回名字已被删除的状态值17H。非活动会话命令有: ListenReceive AnyReceive DatagramReceive Broadcast Datagram447加入组名 NCBADDGRNAME 功能:将网络适配器能识别的非唯一名加入到适配器的NETBIOS命名表中,此名不能被其它适配器作为唯一名使用,但可以作为组名使用。参数:ncb_command = NCBADDGRNAMEncb_name = 组名ncb_lana_num = 协议名ncb_post =后置例程(回调函数)输出:ncb_retcode = 返回码ncb_num = 名字序号ncb_cmd_cplt = 异步执行返回码说明: NETBIOS处理这个命名时,重复广播网络名的查询。 ncb_num 的返回值在以后的数据报支持中要用到。448寻找名称 NCBFINDNAME 功能:在网络上查找一个名字的位置(即机器名)参数:ncb_command = NCBFINDNAMEncb_buffer =缓冲区地址ncb_length = 缓冲区长度ncb_callname = 待查机器名ncb_post = 后置例程(回调函数)ncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码ncb_buffer = 返回数据结构说明:在发出这个命令时,ncb_buffer中就会填入FIND_NAME_HEADER 结构,以及一个或多个FIND_NAME_BUFFER结构。这个命令是Windows NT 和Win2000专用的,尚未获得所有Win32平台的支持。449呼叫 NCBCALL 功能:打开同ncb_callname域指定的目的名进行对话参数:ncb_command = NCBCALLncb_name = 本地名ncb_callname = 呼叫名ncb_lana_num = 协议名ncb_rto = 接收超时,单位1/2秒ncb_post = 后置例程(回调函数)输出:ncb_retcode = 返回码ncb_lsn = 会话号ncb_cmd_cplt = 异步执行返回码说明:目地适配器必须挂起LISTEN命令,这样才能建立会话,即必须先执行侦听命令。一对名字甚至相同名字间可以建立多个会话。ncb_lsn 会话号以1为增量,模255不断循环,但永远不会为0和255。会话号用于以后的数据发送与接收命令中。4410侦听 NCBLISTEN 功能:打开ncb_name域指定的本地名字同ncb_callname域指定的名字间的会话参数:ncb_command = NCBLISTEN ncb_callname = 远程名ncb_name = 本地名ncb_rto = 接收超时ncb_sto = 发送超时ncb_lana_num = 协议号ncb_post = 后置例程(回调函数)输出:ncb_retcode = 返回码ncb_callname = 远程响应机器名ncb_lsn = 会话号ncb_cmd_cplt = 异步执行返回码说明:如果ncb_callname域的第一个位置星号(*),那么发出Listen 命令的适配器可与任何调用CALL命令呼叫本地名的网络适配器建立一个会话。发出CALL命令的名字返回在ncb_callname域。监视指定名字的Listen 命令优先于监视任何名字的Listen命令。会话可以用远程名或本地名建立。可以用同一对名字建立多个会话。由Listen命令的ncb_sto域指定超时时限到达后,与会话相关的所有未成功结束的Send 和Chain Send命令,不包括其No-Ack的命令形式,将中断会话。如果Send或Chain Send命令被后面的Cancel命令取消,则会话中断。超时限值以1/2秒为单位给出。零表示不发生超时。Listen命令没有超时,但占一个会话登记项,Adapter Status 命令把Listen 命令看成是一个挂起的会话。NETBIOS以增量为1,模255,循环方式赋Lsn的值。0和255根本不赋,Lsn值肯定在1至254(FEH)之间。在执行Listen 命令过程中,如果一个唯一名存在于一个以上的表中时,那么返回检测到名字冲突的错误。除了CALL命令成功返回的那个适配器外,所有注册了该名字的适配器都报告检测到名字冲突的错误。如果应用指定星号(*)作为ncb_callname域的第一个字符,那么NETBIOS返回ncb_callname域的值。4411挂起 NCBHANGUP功能:关闭ncb_lsn 域指定的会话。参数:ncb_command = NCBHANGUPncb_lsn = 会话号ncb_lana_num = 协议号ncb_post = 后置例程(回调函数)输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码说明:当会话正常关闭时,返回成功结束的状态值。如果会话不存在(已经关闭或根本不存在),则返回会话已关闭或会话序号非法。当调用Hang Up 命令时,所有与会话相关的被挂起的本地Receive 命令都将终止,且用ncb_retcode域返回会话已关闭的状态值。无论他们是否已接收到数据都将终止。如果此会话的本地Send 或 Chain Send 命令挂起,Hang Up要等到Send或Chain Send 命令完成后才执行。挂起的Send 或 Chain Send 命令无论是在传送数据还是在等待远程那方调用Receive 或Receive Any 命令,Hang Up 都将等待它们完成。当发生下面的某个条件时,Hang Up 命令完成:Send 或 Chain Send 命令完成Send 或 Chain Send 命令中断因为响应其它应用调用Hang Up 命令,会话终止,所以引起Send 或Chain Send 命令失败。因为会话创建时指定的超时时限用尽,所以引起Send 或Chain Send 命令失败。如果调用Hang Up 命令后,在系统超时限值内没有发生上述的任一种情况,Hang Up 命令返回命令超时状态值,中断会话。系统超时值等于系统间隔乘以系统重试次数。这些值都是NETBIOS常数。当会话关闭时,与已终止会话相关的所有被挂起的Send,Chain Send 及Receive命令都返回会话已被关闭的状态。如果只有一个Receive Any 命令与会话使用的本地名相关,并被挂起,那么它返回会话已被关闭状态。然而若有多个Receive Any命令挂起,则仅有一个命令返回会话已被关闭的状态。注意,虽然与会话相关的所有被挂起的Send,Chain Send 及Receive 命令都返回值,但是只有一个(多个中的一个)被挂起的Receive Any 命令返回值。当会话终止时,与此会话相关的远程所有挂起的命令都给调用者返回会话已关闭的关态。4412发送 NCBSEND功能:将报文发送给NcbLsn域LSN值指定的会话方参数:ncb_command = NCBSENDncb_lsn = 会话号ncb_buffer =缓冲区地址ncb_length = 缓冲区长度ncb_post = 后置例程(回调函数)ncb_lana_num = 协议号输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码说明:Send命令将报文发送给NcbLsn域LSN值指定的会话方。NcbBuffer域指向要发送的数据当远方用Hang Up命令关闭会话时,所有与此被关闭会话相关的挂起的本地Send命令都返回会话已关闭的状态,如果存在任一个挂起的Send命令时,调用了Hang up命令,那么Hang up命令完成之前,应完成Send命令。如果会话中断,返回会话异常结束的状态值。如果Send超时,中断会话,返回命令超时状态。Send命令的超时值由创建会话的Call或Listen命令完成时确定,Send命令不能定义这个超时值。报文的大小必须在065,535(64K-1)个字节之间。如果一个会话上有一个以上的Send或Chain Send命令挂起,会话的数据按先进先出原则发送。如果Send命令因某种原因没有完成,则中断会话以保证数据的完整性。在会话的另一方面如果没有相应的Receive命令,Send命令浪费NetBIOS的资源。没有相应的Receive命令而调用许多Send命令是不可取的。用Cancel命令取消Send命令将终止其会话。4413接收 NCBRECV功能:接收某个指定的会话方用Send或Chain Send 命令发送来的数据。参数:ncb_command = NCBRECVncb_lsn = 会话号ncb_buffer = 接收缓冲区ncb_length = 接收缓冲区长度ncb_lana_num = 协议号ncb_lana_num = 协议号ncb_post = 后置例程(回调函数)输出:ncb_retcode = 返回码ncb_cmd_cplt = 异步执行返回码ncb_length = 接收包的长度 说明:Receive 命令不能检测到Send No Ack 或Chain Send No Ack 命令发送给它的数据,这一点上它们不同于Send和Chain Send.如果在特定的会话中有多个能接收数据的命令被挂起时,按下列优先次序处理:1 Receive2 Receive Any for A Specified Name3 Receive Any for Any Name命令根据优先级排序,在同一优先级的命令按先进先出处理。Receive的超时值由创建该会话的CALL或Listen 命令定义,Receive 命令不能定义这个时值。因为所有的应用处理必须到命令完成后才能继续,所以要小心使用这个命令的等待选项(同步命令)。无论用本地的Hang Up 命令,还是远程的Hang Up 命令关闭会话,会话中挂起的所有Receive 命令都返回会话已关闭状态。如果接收缓冲区对要接收的报文而言不够大,则返回报文待续状态(06H)。为了在会话的另一端出现Send超时前,获得其余信息,本地应用要调用另外的Receive或Receive-Any命令。然而,如果数据是由Send
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 耐火纤维制品整型工抗压考核试卷及答案
- 梳理热风非织造布制作工作业指导书
- 钛汞合金冶炼工综合考核试卷及答案
- 铁合金成品工设备调试考核试卷及答案
- 尾矿处理工作业指导书
- 新能源发电厂设备维护方案
- 2025年实验诊断技术实验方案设计答案及解析
- 呼叫中心客服话术及案例分析
- 概率统计案例题库与解析
- 七年级数学期末考试试题分析
- 建筑用砂石料采购 投标方案(技术方案)
- 中华护理学会成人肠内营养支持护理团标解读
- 医疗器械质量安全风险会商管理制度
- 电工仪表与测量(第六版)中职技工电工类专业全套教学课件
- 确保工期的资源保障措施
- 项目时间安排
- 天津市二手房买卖通用版合同合集3篇
- 酒店运营方案抖音
- 常用食物含铜量表-献给有需要的人
- 七年级劳技“手工制作”上课(共74张)课件
- 进修汇报材料课件
评论
0/150
提交评论