第2章 NetBIOS编程.ppt_第1页
第2章 NetBIOS编程.ppt_第2页
第2章 NetBIOS编程.ppt_第3页
第2章 NetBIOS编程.ppt_第4页
第2章 NetBIOS编程.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,Windows网络程序设计,第2章基于NetBIOS的网络编程,2,2.1NetBIOS概述,NetBIOS:网络基本输入/输出系统是一个应用程序接口(API)。为程序提供了请求低级网络服务的统一命令集,实现给局域网提供网络以及其他特殊功能的目的。NetBIOS是针对LAN开发的,是一种不可路由的协议,数据报无法跨网段传输。目前NetBIOS最广泛的应用之一就是对NetBIOS用户扩展接口(NetBEUI,NetBIOSExtendUserInterface)协议的使用。NetBEUI可以看作是NetBIOS协议的延伸及改良版本,具有体积小、效率高以及速度快等特点,运行在标准802.2数据链协议层上。NetBEUI协议同样不是一种可路由的协议,主要用于本地局域网中,一般不能用于与其他网络的计算机进行沟通,这一点不同于TCP/IP、IPX/SPX协议。,3,2.2NetBIOS应用服务,在网络层次中,NetBIOS工作于国际标准化组织(ISO)开放系统互连(OSI)的参考模型中的表示层与会话层之间,处于参考模型的高层。因此,其接口程序的应用在很大程度上与较低层次的各种活动相隔离,并支持IEEE802.2的逻辑链路控制(LLC)协议。NetBIOS程序的网络通信功能主要是通过四种NetBIOS应用服务实现的:(1)名字支持(2)数据报支持(3)会话支持(4)一般命令,4,2.2.1NetBIOS名字每个NetBIOSLAN适配器在其所处的网络中用一个或多个网络名字来表示自己,以区别于其他的适配器。网络通信程序用名字开始和结束会话,这样就允许LAN应用程序将信息正确地传送到某个指定的适配器上的某个特定应用程序上,并且还可以在发送信息中标记发送该信息的来源。当多个程序配置一台单独的机器时,每个程序都有独特的NetBIOS名称。每台支持应用的PC通过用户定义或通过内部方法获得NetBIOS站名。一个NetBIOS名称包含16个字节,并且对大小写敏感。一个应用程序可使用多个名字,多个应用程序也可以使用同一个给定的名字。运行基于NetBIOS的网络上通信之前,PC必须先登记NetBIOS名称,即获得注册使用该名字的权利。一个名字在成功注册后,除了第一个注册名字以外均可用NetBIOS的名字管理命令来撤销。重新启动系统或关闭工作站电源将会擦掉NetBIOS的命名表。NetBIOS名字根据功能的不同可以分为唯一名、组名、永久节点名和符号名。,5,一个名字在成功注册后,除了第一个注册名字以外均可用NetBIOS的名字管理命令来撤销。重新启动系统或关闭工作站电源将会擦掉NetBIOS的命名表(见后面介绍)。NetBIOS名字根据功能的不同可以分为唯一名、组名、永久节点名和符号名。,6,2.2.2NetBIOS数据报1.广播式数据报(广播型)2.普通数据报(定向型)数据报通信的主要优点是它所消耗的工作资源比会话通信少,省去了建立连接所需的开销。但这种类型的服务不提供任何保障,除非依赖自服务器传来的响应,否则,对因目标接收机退出网络、掉电、数据丢失等多种原因导致的数据传输失败,都不会提供任何错误提示。,7,2.2.3NetBIOS会话1.建立会话2.接收命令3.发送命令4.结束会话会话通信的优点体现为,在保证通信具有极高可靠性的同时,数据包的收发顺序正确无误。但是,会话是一种“以消息为基础”的服务,建立会话、维护会话及适配器之间数据包应答的开销保证了其可靠性。需引起注意的是:NetBIOS假定局域网足够快,能够传输需要的数据,因而没有为会话服务设计流控制。,8,2.2.4NetBIOS一般命令1.Reset命令2.AdapterStatus命令3.FindName命令4.Trace命令5.Cancel命令,9,2.3Ncb/Mcb,Ncb:网络控制块,通常应用程序是通过使用Ncb实现对NetBIOS的访问的。通常应用程序调用NetBIOS网络服务功能时,需要完成三个步骤:构造一个Ncb把Ncb的地址写入ES:BX寄存器,作为指向该Ncb的远程地址指针。执行5CH中断。,10,2.3.1Ncb/Mcb域在Win32环境VC+6.0编译器中,Ncb的结构在nb30.h文件中定义。下面是Ncb结构的定义。Ncb有64个字符,分为14个域(或称为字段)和一个10字节的保留域。,11,12,13,1.命令每一个发往NetBIOS的Ncb都代表一项要执行的动作,具体执行哪项动作,由命令字段的取值决定(参见附录1)。应用程序可通过对命令结束标志字段值的轮询来了解命令执行的状态。命令执行完毕后,最终的返回码存放在Ncb结构的命令结束标志字段中。NetBios命令及其在NCB.H中定义的代码。,14,15,2.返回码命令提交给NetBios驱动程序后,该命令的成功与否即在该字段中反映出来。若ncb_retcode字段值为00h,则表示命令成功。对于异步NetBios命令NetBios将立即在ncb_retcode字段中返回值FFh,表明该命令已经排队,即将执行。命令执行完毕后,同ncb_cmd_cplt一样,ncb_retcode将置成最终的返回码。,16,3.本地会话编号同远程应用程序处理建立了会话后,NetBios驱动程序将相应设置该字段(局部会话号)。在随后的通信中,若想同远程处理进行通信,本地处理只需在NCB结构中指明局部会话号,不再需要在ncb_callname字段中指定完整的远程处理逻辑名。4.名字编号工作站上的每一个处理最多可向名表中加进254个逻辑名。成功地将一逻辑名加进LANA的私有名表后,NetBIOS将置名字编号字段值为该名在名表中的索引值(索引值称为名号),在以后的同远程处理进行的非连接式通信中可使用这个名号。,17,5.缓冲区地址该字段的值是要发送的数据缓冲区的地址,或者要在其中存放接收到的数据的缓冲区的地址。6.缓冲区长度该字段指定的是由缓冲区地址字段指定的缓冲区的长度。接收到一块数据时,NetBIOS将相应设置该字段。7.调用(远程)名调用(远程)名是一个由应用程序设置的16字节域,其值是远程处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。在远程驱动程序连接正期待着接收连接呼叫的本地处理时,NetBIOS将填写该字段。,18,8.本地名本地名是由应用程序设置的16字节字段(所有的字节均有用),其值是本地处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。该字段的第一个字节不能是二进制0或星号;另外,IBM保留了头三个字节,所以头三个字节不能是IBM。最后,第16个字节不能是00h1Fh之间的值。9.接收超时当期望从一个或数个远程处理接收到一个数据包时,应用程序可在接收超时(接收时间限制)字段中指定等待的最大时间数值(以1/2s为间隔单位)。若超过了指定时间仍未接收到包,则NetBIOS驱动程序将在接收超时字段中返回错误。若接收超时字段值为00h,则表示阻止执行,直到本地处理接收到一个数据包。,19,10.发送超时发送超时(发送时间限制)字段类似于接收超时字段,但它指定的是等待NetBIOS连接式命令Send完成的时间。若超过了指定时间,则将返回错误。若发送超时字段值为00h,则表示不为发送操作指定时间限制。此时,命令将阻止执行,直到要么成功地发送了一个数据包,要么NetBIOS层停止了重试。11.POST例程地址在提交异步命令时,应用程序可以设置该字段。在MS-DOS中,应用程序将后处理例程的地址填在该字段中。所谓后处理例程,即命令执行完毕后NetBIOS驱动程序将要调用的例程。,20,12.LANA编号一台工作站上可能有不止一个LANA卡或网络协议(或传输驱动程序),所以Ncb中的LANA编号字段是用来指明应用程序想使用哪一个网络适配器上的哪个网络协议的。该字段称为LAN适配器号或LANA号,LANA编号在09之间。在像MicrosoftLANManager这样的网络软件环境中,可以同时装入多个传输驱动程序(例如TCP/IP、NetBIOS或XNS),其中每一个驱动程序都提供了一个NetBIOS接口。同时,一台工作站可能有不止一个LAN适配器卡,这种情况下LANA编号字段指定的是某一特定对,即应用程序想使用的传输驱动程序和LANA卡。注意:只有基于相同NetBIOS协议的程序才能相互通信。,21,13.命令结束标志NetBIOS驱动程序利用该字段来表明异步命令已完成。起先,当应用程序提交一条异步命令时,NetBIOS将置该字段值为FFh。待命令执行完毕后,再将最终值填入该字段。也就是说,提交了一条非等待命令后,应用程序可以监视(轮询)该字段的取值以了解命令是否完毕,直到其值不再是FFh为止。14.保留域NetBIOS在处理请求的过程中,用它来作暂存区。应用程序不应使用Ncb的保留域,因为一旦它遭到破毁,NetBIOS的行为将是不可预测的。15.事件句柄在提交异步命令时,应用程序可以设置该字段。该域用于存放后处理例程的句柄。注意:当命令域的设置使用ASYNCH(异步)标志时,该域的设置与POST例程地址域的设置互斥,即其中必须有一个域的设置为0,而另一个为非0值。,22,Ncb的填充、调用程序段(在填写Ncb结构成员之前,必须对这个Ncb结构清零)/Getthestatusoflocalorremoteadapter/intAstatus(ADAPTER_STATUS*astat,intlana,char*name)NCBncb;ZeroMemory(,23,2.3.2NetBIOS命令调用Netbios()函数是将ES:BX寄存器对指向Ncb地址,调用INT5Ch中断请求来实现命令的调用的。另一个调用NetBIOS请求的方法是使用INT2Ah请求。后一种方法将AX寄存器值赋为0400h或0401h,同样ES:BX寄存器对应作为Ncb的远程地址指针。,24,2.3.3NetBIOS命令的完成当一个应用程序向NetBIOS提交Ncb后,NetBIOS给发出请求的应用程序提供一个返回码,它通过对返回码的观察就可以了解NetBIOS命令的完成情况。1.等待选项如果命令域高位为二进制数0,则命令使用等待方式。如果命令使用等待选项,适配器直到完成命令后,才将控制权还给应用程序。当命令执行完毕后,最后的返回码放在AL寄存器、返回码域及命令结束标志域中。控制权返回到紧随在NetBIOS请求中断后的那条指令。2.不等待选项如果命令域高位为二进制数1,则命令使用不等待方式。如果命令使用不等待选项,则NetBIOS将提交两个返回码。初始扫描Ncb后,立即将返回码放在AL寄存器中,控制权返回给紧跟在NetBIOS请求后面的那条指令。如果立即返回码不是00h,则适配器不能成功执行该命令。如果立即返回码是FFh,则适配器将把请求排入队列,等待最终完成。,25,2.4NetBIOS编程基础,通常,在Win32环境下,使用VC+6.0进行NetBIOS程序开发时,必须在菜单的工程属性中的Link选项卡上加入netapi32.lib静态链接库,并在文件中加入nb30.h文件来引入NetBIOS编程元素。前者定义了NetBIOS应用,后者定义了NetBIOS的所有函数声明和常数定义。,26,27,1.探测LANA资源LanaEnum是几乎所有NetBIOS应用都会用到的一个基本函数。我们知道一台主机中可能不止安装一块网卡、一种具有NetBIOS功能的通信协议,为了了解可以使用的LANA资源,通过调用该函数,可探测系统上可用的所有LANA编号。在填写Ncb时,首先对该Ncb结构清零,以防止内存中原来的数据导致当NetBIOS命令结束时NetBIOS错误地进入其他内存区域。然后,在这个清零后的Ncb块中填写参数,在命令域中填入NCBENUM命令索引,同时为返回值指定接收缓冲区(格式为LANA_ENUM,LANA_ENUM如下文所示)并设置缓冲区长度,这样就完成了LanaEnum命令的Ncb块的填写。最后只要调用Netbios函数来执行该命令即可,程序代码如下。,28,intLanaEnum(LANA_ENUM*lenum)NCBncb;ZeroMemory(,29,2.复位LANAResetAll也是几乎所有NetBIOS应用都会用到的一个基本函数。一旦拥用一个LANA_ENUM结构,并有来自LanaEnum的LANA编号,就需要对每个LANA编号进行复位,一方面这是一个好的编程习惯,另一方面有些操作系统如WindowsNT等要求必须对每一个LANA号进行复位。复位的方法:首先在命令域填入NCBRESET命令索引,然后将本地会话编号置1,再依次输入LANA号即可,所有的资源都会释放。当本地会话编号为0时,不但资源会释放而且会分配新的资源,新资源按照ncb_callname域的设置进行分配。ncb.ncb_callname0指定同时进行的最大会话数量;ncb.ncb_callname1指定每个LANA增加的最大NetBIOS名字数量;ncb.ncb_callname2为TRUE时,一个客户机可以将机器名作为自己的NetBIOS进程名。,30,intResetAll(LANA_ENUM*lenum,UCHARucMaxSession,UCHARunMaxName,BOOLbFirstname)NCBncb;ZeroMemory(,31,3.添加程序名名字是应用程序标识自己的重要参数,只有把名字成功加入到名字表中,应用程序才具有合法的网络身份;同时,通过名字区分,网络通信程序才能够与想要与之建立联系的其他程序建立会话,或把数据报发送到指定的地方。添加程序名的方法:首先在命令域填入NCBADDNAME命令索引,然后在LANA编号域填入LANA号,最后在本地名域填写程序名即可。命令完成后会在ncb.ncb_num中返回名字编号,名字编号是网络信息传递命令所必需的参数,十分重要。,32,intAddName(intlana,char*name,UCHAR*num)NCBncb;ZeroMemory(,33,4.取消命令取消命令用于取消进行中或处于待决状态(命令结束标志域的值为NRC_PENDING)的NetBIOS操作命令。取消命令需在命令域填入NCBCANCEL命令索引,在LANA编号域填入LANA号,在缓冲区地址域填写所需要取消的NetBIOS命令的Ncb指针。有些命令不能被取消命令所取消。,34,intCancel(PNCBpncb)NCBncb;ZeroMemory(,35,5.挂起挂起(Hangup)命令可以关闭已经建立的会话。执行挂起命令时,所有尚未进行的接收调用都会中止,并返回一个会话关闭错误:NRC_SCLOSED。挂起命令需在命令域填入NCBHANGUP命令索引,在LANA编号域填入LANA号,在本地会话编号域填写所需要挂起的会话编号。,36,intHangup(intlana,intlsn)NCBncb;intretcode;ZeroMemory(,37,6.删除程序名字由于名字表的资源有限,因此在程序运行完毕后应当把名字从名字表中删除掉。删除程序名的命令需在命令域填入NCBDELNAME命令索引,在LANA编号域填入要删除的那个名字所在的LANA号,在本地名域填写所需要删除的程序名。,38,intDelName(intlana,char*name)NCBncb;ZeroMemory(,39,NetBIOS编程例设计目标:用NetBIOS来编写获取网络适配器信息的完整程序,程序利用网络基本输入/输出系统NetBIOS创建了一个能获取主机MAC信息及其他一些信息的控制台应用status.exe。,40,NetBIOS编程例设计思路:首先程序构造一个Ncb结构,并对其进行清0操作(为了简单起见仅对LANA0进行处理)。复位LANA(仅LANA0)执行Astatus()函数,执行后的结果放入一个ASTAT结构。ASTAT包含两个成员:一个成员是ADAPTER_STATUS结构的adapt,用于收集适配器的状态信息;另一个成员为NAME_BUFFER结构的NameBuffer指针,用于收集适配器上该LANA号0所属的名字表。adapt的成员具有不同的含义:adapter_address指针指向包含适配器物理地址缓冲区;adapter_type的值代表适配器类型,当值为0 xFF时,适配器为令牌环网络适配器,值为0 xFE时,适配器为以太网适配器;rev_major和rev_minor表示适配器版本号;name_count包含适配器LANA0上的名字表中名字的个数,当然这些名字都被收集进NameBuffer所指向的缓冲区。打印结果。,41,intmain(intargc,char*argv)NCBncb;UCHARuRetCode=0;charname16;/resetadapterZeroMemory(,定义Ncb,Ncb结构清0,复位LANA0,获取LANA信息,输出结果,42,2.5数据报通信程序设计,应用程序间的网络通信可以使用数据报或会话两种方式。数据报是一条短停息,它的长度NetBIOS实现方法的不同而不同。数据报不能保证数据的正确传输也不提供来自接收方的指示,如果目标不存在、未加电或不接收数据报时,发出的数据报可能不会被任何计算机接收。数据报具有占用网络资源少的优点,适合于发送重要性要求不高的一般信息。,43,2.5.1数据报通信模型广播式数据报不区分接收者的身份发送命令SendBroadcastDatagram接收命令ReceiveBroadcastDatagram定向型数据报必须指定接收者的身份发送命令SendDatagram接收命令ReceiveDatagram,44,2.5.2广播式数据报程序首先用LanaEnum来收集宿主机中所有可用的LANA编号,然后用ResetAll来重设每个LANA,这几乎是所有NetBIOS应用程序都要采用的两个步骤。完成初始化工作后,需要将程序注册到LANA中。这里我们希望编写一个既能发送又能接收的程序,即LAN中收发端程序名相同。为了不产生名字冲突,可采用NCBADDGRNAME命令的方式注册名字。程序利用NCBADDGRNAME命令得到的名字编号dwNum就可以进行数据报的发送了,发送功能由DatagramSendBC()函数完成。如果函数执行成功,buffer中的消息将通过LANA传递到LAN上,并会返回整数NRC_GOODRET。在main发出NCBDGSENDBC命令后,程序执行广播式数据报接收命令,接收LAN中由NCBDGSENDBC命令发送的任意消息。这里我们需在事件句柄域填入一个事件句柄hEvent,这个句柄是用来进行接收监控的。如果函数调用成功,将返回整数NRC_GOODRET。,45,在为每个lana投放一个异步接收命令后,我们并不知道其中哪一个会首先接收到数据报,因此采用一个监控方法来完成等待任务。这个监控方法采用Win32事件作为传信机制,具体是利用处于循环状态的WaitForMultipleObjects()函数监控上述NCBDGRECVBC命令绑定的事件句柄来完成的。通过WaitForMultipleObjects()的监控,一旦任何一个NCBDGRECVBC接收到数据报,WaitForMultipleObjects()将会返回这个NCBDGRECVBC的序号。接下来,我们根据序号查看这个NCBDGSENDBC的Ncb命令结束标志域,如果不为NRC_PENDING,则表示接收成功,buffer中将填充从LAN上接收到的数据报。最后,打印所收听到的消息以及发送者的NetBIOS名。,46,intmain(intargc,char*argv)定义相关数据结构控测得到所有LANA复位所有lana为相关变量分配内容为每一个LANA注册名字从每个LANA上发送数据报为每个LANA绑定事件句柄,并接收数据报监控所有事件句柄取出数据报内容并取消其它接收命令删除NetBIOS名并释放内容return0;,/在指定LANA上发送数据报/intDatagramSendBC(intlana,intnum,char*buffer,intbuflen)./在已注册机器名上指定LANA上接收数据数据报/intDatagramRecvBC(PNCBpncb,intlana,intnum,char*buffer,intbuflen,HANDLEhEvent)./把NetBIOS名转换为可输出字符/intFormatNetbiosName(char*nbname,char*outname).,47,2.5.3定向型数据报程序定向型数据报程序把数据报发送到注册为指定的唯一名或组名网络应用程序上。DatagramRecv()与DatagramRecvBC()的区别仅仅是命令索引不同,为NCBDGRECV。DatagramSend()与DatagramSendBC()的区别除了命令索引不同(为NCBDGSEND)外,还必须在调用名域填写接收应用程序的NetBIOS名(可以是唯一名也可以是组名),数据报的接收将受到这个名字的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论