版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章基于NetBIOS的网络编程网络基本输入/输出系统(NetBIOS)是一个传统的应用程序接口(API),用于数据源和目的地之间的数据交换。NetBIOS同时兼容于较老的操作系统,如OS/2和DOS等。NetBIOS为程序提供了请求低级网络服务的统一命令集,从而实现了给局域网(LAN)提供网络以及其他特殊功能的目的。目前NetBIOS改进版(NetBEUI)与TCP/IP以及IPX/SPX合称为LAN通信三大协议。此外,几乎所有的LAN都是在NetBIOS协议基础上工作的。第2章基基于NetBIOS的网络络编程2.1NetBIOS的基本概概念2.2NetBIOS命令2.3数数据据报通信信程序设设计2.4会会话话通信程程序设计计2.1..1NetBIOS概述述NetBIOS是一种标标准的应应用程序序编程接接口(API)),1983年由Sytex公司专为为IBM开发成功功,它为为网络通通信定义义了一种种编程接接口。1985年,IBM创建了NetBIOS扩展用户户接口NetBEUI,它同NetBIOS接口集成成在一起起,构成成了一套套完整的的协议。。后来由由于NetBIOS接口愈来来愈流行行,所以以各大厂厂商也开开始在其其他(如如TCP//IP))协议上实实施NetBIOS程序接口口。NetBIOS特性1、NetBIOSAPI接口适用用于为数数众多的的网络协协议,使使得程序序接口““与协议议无关””。2、NetBIOS协议短小小精练,,与TCP//IP和IPX//SPX相比具有有极高的的网络通通信性能能,非常常适用于于实时性性要求较较高的小小型LAN网络环境境3、NetBIOS同时提供供了“面面向连接接”与““非面向向连接((无连接接)”服服务NetBIOS特性4、利用用NetBIOS接口编程程必须注注意以下下三个问问题:①为保保证两个个NetBIOS应用程序序通过网网络进行行正常通通信,那那么对它它们各自自执行的的计算机机来说,,至少必必须安装装一种两两者通用用的协议议②MicrosoftTCP/IP和NetBEUI在默认的的情况下下已提供供了NetBIOS接口,但但是IPX//SPX却并非如如此;③与TCP//IP和IPX//SPX不同,NetBEUI不是一种种“可路路由”协协议,因因此要想想在两个个不同子子网中保保证两个个NetBIOS应用程序序正常通通信,那那么在配配置网络络时,至至少应安安装一种种可路由由的传送送协议。。NetBIOS在Windows中中的应用用Windows的客户机机/服务务器(C/S))网络系统统就是基基于NetBIOS的网络;;WindowsNT操作系统统中的大大量的内内部联网网工作也也都是利利用NetBIOS来完成的的。微软还为为许多协协议提供供了标准准NetBIOS界面,如如TCP//IP、、NetBEUI和NWLink,,使NetBIOS的应用更更加趋于于方便网络应用用举例::浏览网网上邻居居、共享享文件Windows2000//XP中的NetBIOS的设置DHCP是DynamicHostConfigurationProtocol的缩写写,它是是TCP/IP协议簇簇中的一一种,主主要是用用来给网网络客户户机分配配动态的的IP地地址。这这些被分分配的IP地址址都是DHCP服务器器预先保保留的一一个由多多个地址址组成的的地址集集,并且且它们一一般是一一段连续续的地址址。在TCP/IP上使用用NetBIOS需要要LMHOSTS与WINS服务器器来注册NetBIOS名字。。Windows2000//XP中的NetBEUI的设置2.1..2LANA编号号问题:传传送协议议与NetBIOS如何对应应起来呢呢?LANA编号———LAN适配器编编号定义:每每个LANA编号对应应于网卡卡及传输输协议的的唯一组组合。举例:假假定某工工作站安安装了两两块网卡卡,以及及两种具具有NetBIOS能力地传传输协议议:TCP//IP和NetBEUI,那么总共共就有4个LANA编号。LANA编号下面是它它们之间间的一种种对应关关系:0NetBEUI—网卡11TCP//IP——网卡12NetBEUI—网卡23TCP//IP——网卡2通常,LANA编号的范范围在0~9之之间,除除LANA0之外,其其它编号号由操作作系统自自行分配配,LANA0表示的是是“默认认”LANA若某工作站装有两块网卡以及三种具有NetBIOS能力的传输协议(如TCP/IP、NetBEUI和IPX/SPX),那么它有多少个LANA编号?2.1..3NetBIOS名字字NetBIOS是一种按名字工工作的系统,,NetBIOS保留一张张名字表表,每个个名字都都是16字节长长。NetBIOS名字有两两种类型型:唯一名:某个节节点的应应用进程程在网络络中注册册的独一一无二的的名字。。组名:多个节节点可拥拥有同一一组名。。主要用用于多点点发送的的数据通通信,NetBIOS名字注意:1、为一一个节点点指定名名字时,,注意不不要用““*”号号或二进进制“0”开头头,也不不要用““IBM””这3个字字母开头头。2、对每每个LANA来说,能能够添加加的名字字的最大大数量是是254,名字字号从1到254(0和255由系系统保留留)2.1..4NetBIOS接口口函数NetBIOSAPI函数:UCHARNetbios(PNCBpncb)(1)该函数只只有一个个参数pncb,它对应于于指向某某个网络络控制块块NCB的一个指指针,在在NCB结构中,,包含了了为执行行一个Netbios命令相对对应的Netbios函数需要要用到的的全部信信息。结结构定义义见书上上P14--P15:typedefstruct_NCB{UCHARncb__command;//指定要执执行的Netbios命令UCHARncb__retcode;//指定操作作的返回回值UCHARncb__lsn;//对应一个个本地交交互编号,成功功执行NCBCALL或NCBLISTEN命令后,,函数会会返回一一个新的的交互编编号UCHARncb__num;//指定本地地名字的的编号,,NCBADDNAME或NCBADDGRNAME命令的每一一次使用用,都会会返回一一个新的的编号PUCHARncb__buffer;//指向数据据缓冲区区WORDncb__length;//指定缓冲冲区的长长度UCHARncb__callname[[NCBNAMSZ];//指定远程应用用程序名名字
UCHARncb__name[NCBNAMSZ];//指定应用用程序已知的的名字UCHARncb__rto;//设置接收收操作的的超时期期限UCHARncb__sto;//设置发送送操作的的超时期期限void(CALLBACK*ncb__post)(struct_NCB*));//指定异步步命令完完成后需需要使用的的post例程的地地址UCHARncb__lana_num;//指定要在在上面执执行命令的LANA编号UCHARncb__cmd_cplt;//指定操作作代码的的返回值UCHARncb_reserve[[10]];//保留,必必须为0HANDLEncb__event;//指定设置置Nonsignaled状态的一一个windows事件对象象的句柄柄}NCB,*PNCB;并不是在在对NetBIOS的每次调调用中都都需要用用到Ncb结构内的的全部成成员,在在调用一一个NetBIOS命令时并并不一定定要填写写每一个个NCB域;此外外,NCB中的一些些域具有有输出参参数的功功能,命命令执行行后的返返回值将将填充到到这些域域中。还应当注注意的是是,在填填写NCB结构成员员之前,,必须对对这个NCB结构清零零,消除除残留参参数的影影响,然然后再开开始填写写结构内内的相应应成员。。UCHARAddName(CHAR**Name,UCHARLana,,UCHAR**NameNum){NCBncb;memset((&ncb,0,sizeof(NCB)));ncb..ncb_command==NCBADDNAME;ncb..ncb_lana__num=Lana;;strcpy(((char**))ncb.ncb_name,Name));Netbios(&ncb));*NameNum==ncb.ncb_num;;return((ncb.ncb_cmd__cplt);;}NetBIOS接口函函数(2)使使用函数数Netbios必须注意意:①程程序的头头文件中中必须包包含“nb30.h””:#include<<nb30.h>②程序在链链接时加加入“netapi32.lib””:#pragmacomment(lib,““netapi32..lib”)2.2NetBIOS命令NetBIOS的所有功功能都是是通过执执行一系系列的命命令来完完成的,,共26条命令令。(1)NetBIOS命令中大大多命令令都有同同步(等等待)或或异步((非等待待)两种种状态,,所有命命令默认认为同步步:同步状态态:命令令原型异步状态态:命令令原型|ASYNCH同步方式式和异步步方式的的比较::采用同步步方式时时,NetBIOS要等到该该命令完完成之后后才能返返回到你你的程序序。采用异步步方式时时,将后后续处理理程序的的地址或或一个事事件句柄柄告诉给给NetBIOS,然后NetBIOS立即返回回到当前前程序,,当该命命令执行行完成时时将自动动唤醒处处理程序序或触发发相应的的事件。。为了提高高程序的的执行效效率,通通常采用用异步方方式,只只有少数数几个NetBIOS命令必须须采用同同步方式式,如NetBIOS复位命令令。(2)26条命命令分类类:①控制制和测试试命令((5条)):控制命令令(3条条):NCBRESET、NCBCANCEL、、NCBUNLINK;测试命令令(2条条):NCBSSTAT、NCBASTAT②名字管理理命令((3条)):NCBADDNAME、NCBADDGRNAME、NCBDELNAME③数据报通通信命令令(4条条):NCBDGSEND((或NCBDGSEND||ASYNCH)NCBDGRECV((或NCBDGRECV||ASYNCH)NCBDGSENDBC(或NCBDGSENDBC|ASYNCH))NCBDGRECVBC(或NCBDGRECVBC|ASYNCH))④会话通信信命令((9条)):NCBCALL、NCBLISTEN、NCBSEND、NCBCHAINSEND、NCBSENDNA、、NCBCHAINSENDNA、、NCBRECV、NCBRECVANY、NCBHANGUP⑤其他(5条)::NCBACTION、、NCBENUM、NCBFINDNAME、NCBLANSTALERT、NCBTRACE2.3基基本本程序2.3..1初初始化化程序2.3..2加加名字字与删除除名字2.3..1初初始化化程序NetBIOS的初始化化程序主主要包括括两个函函数:EnumLana()):获得当前前所有可可用的网网卡编号号(0~~254)ResetNcb()):复位指定定网卡上上的NetBIOS接口,并并重设相相关的环环境参数数ResetNcb())必须在所所有NetBIOS应用中首首先被执执行,只只有初始始化成功功,才能能进行后后面的工工作。LanaEnum())NCB输入:ncb__command=NCBENUMncb__buffer:分配一个个LANA_ENUM结构ncb__length:设为LANA_ENUM结构的长长度NCB输出:ncb__cmd_cplt:命令的最最终返回回码,成成功为NRC__GOODRET若命令成成功执行行,则会会填充指指定的LANA_ENUM结构,其其结构定定义如下下:TypedefstructLANA_ENUM{UCHARlength;//指出本地地计算机机共有多多少个LANA编号UCHARlana[MAX_LANA];//由实际的的LANA编号构成成的一个个数组,}而length值指出lana数组内有有多少个个元素会会被填充充LANA编号。UCHARLanaEnum(LANA_ENUM**lenum){NCBncb;UCHARucRc;memset((&ncb,0,sizeof(NCB)));ncb..ncb_command==NCBENUM;ncb..ncb_buffer=((PUCHAR)lenum;ncb..ncb_length=sizeof((LANA_ENUM);ucRc=Netbios((&ncb);;return((ucRc);;}ResetNcb()NCB输入:ncb__command=NCBRESETncb__callname[[0]::可同时进进行的最最大会话话数(0为缺省省)ncb__callname[[2]::可增加的的最大NetBIOS名字数((0为缺缺省)ncb__callname[[3]::是否允许许主机名名作为自自己的NetBIOS名字ncb__lana_num:指定要执执行复位位的LANA编号NCB输出:ncb__cmd_cplt:命令的最最终返回回码,成成功为NRC__GOODRET(0)UCHARRestNCB(UCHARlana)){NCBncb;UCHARucRc;memset((&ncb,0,sizeof(NCB)));ncb..ncb_command==NCBRESET;;ncb..ncb_callname[0]]=MAXSESSIONS;ncb..ncb_callname[2]]=MAXNAMES;ncb..ncb_callname[3]]=TRUE;;ncb..ncb_lana__num=lana;;ucRc=Netbios((&ncb);;return((ucRc);;}初始化NetBIOS程序示例例改造main()函数voidmain((){LANA_ENUMlenum;;UCHARucRc;inti;PNCBpncb;;ucRc=LanaEnum(&lenum);;if(ucRc!=0){printf(("LanaEnumErrorcode:%d",ucRc);return;}}else{printf(("LanaEnumok!%d\n"",lenum.length);;for((i=0;i<<lenum..length;i+++) {printf(("可用的lana编号有%d\n",lenum.lana[i]]);if(RestNCB(lenum.lana[[i]))!=NRC__GOODRET)printf(("ResetNcbError!"));elseprintf(""ResetNcbOk!!");;continue;}}}}}}运行结果果:2.3..2加加名字字与删除除名字NetBIOS是基于名名字通信信的系统统,通常常情况下下,都应应该为应应用进程程加入若若干名字字(唯一一名或组组名),,以适应应不同通通信进程程的需要要,在一一个通信信进程结结束时,,还应该该删除不不再使用用的名字字,以便便释放相相应的系系统资源源。加名字与与删除名名字函数数主要函数数有:AddName()::在本地名名字表中中添加一一个唯一一名字,,并返回回一个名名字号AddGroupName(():在本地名名字表中中添加一一个组名名,并返返回一个个名字号号DeleteName()::在本地名名字表中中删除一一个唯一一名或组组名AddName()AddName():AddGroupName(()、DeleteName()与AddName()类似NCB输入:ncb__command=NCBADDNAMEncb__name:要添加的的16字字节的名名字字符符串ncb__lana_num:指定要执执行命令令的LANA编号NCB输出:ncb__num:返回新注注册名字字的编号号ncb__cmd_cplt:命令的最最终返回回码,成成功为NRC__GOODRET(0)UCHARAddName(CHAR**Name,UCHARLana,,UCHAR**NameNum){NCBncb;memset((&ncb,0,sizeof(NCB)));ncb..ncb_command==NCBADDNAME;ncb..ncb_lana__num=Lana;;strcpy(((char**))ncb.ncb_name,Name));Netbios(&ncb));*NameNum==ncb.ncb_num;;return((ncb.ncb_cmd__cplt);;}UCHARAddGroupName((CHAR**Name,,UCHARLana,,UCHAR**NameNum)){NCBncb;memset((&ncb,0,sizeof(NCB)));ncb..ncb_command==NCBADDGRNAME;ncb..ncb_lana__num=Lana;;strcpy(((char**))ncb.ncb_name,Name));Netbios(&ncb));*NameNum==ncb.ncb_num;;return((ncb.ncb_cmd__cplt);;}UCHARDeleteName(CHAR**Name,UCHARLana){NCBncb;memset((&ncb,0,sizeof(NCB)));ncb..ncb_command==NCBDELNAME;ncb..ncb_lana__num=Lana;;strcpy(((char**))ncb.ncb_name,Name));Netbios(&ncb));return((ncb.ncb_cmd__cplt);;}加名字与与删除名名字程序序示例加名字与与删除名名字程序序示例((续)2.3数数据据报通信信程序设设计数据报((Datagram)是一种““非面向向连接””的通信信方式。。作为发发送方,,只需指指定接收收方的NetBIOS名字作为为目标地地址便可可实现数数据报发发送,此此时,NetBIOS不会执行行任何检检查,不不能确保保数据的的完整性性、抵达达顺序或或者传输输的可靠靠性等等等。数据报发发送共有有三种方方式:将数据报报发送到到一个特特定的唯唯一名,,则只有有注册了了该名字字的那个个进程才才有权接接收将数据报报发给一一个组名名,则只只有注册册了该组组名的那那些进程程才有权权接收将数据报报广播到到整个网网络,局局域网内内任何一一个工作作站上的的任何进进程都有有权接收收这个数数据报消消息数据报的的接收对对应也有有三种方方式。前两种要要用特定定的本地地名字来来接收,,若有指指定发送送方名字字,则只只接收这这个名字字发来的的数据,,反之则则无论谁谁发来的的数据都都接收。。对于第三三种,不不用指定定任何本本地名字字号。基于NetBIOS的数据报报通信的的基本模模型客户机A客户机BResetNcb()AddName()Send()DeleteName()ResetNcb()AddName()Recv()DeleteName()发送数据报到客户机BRecv()Send()发送数据报到客户机A2.3..1点点对点点数据报报通信程程序点对点通通信是数数据报通通信程序序的一种种简单应应用。发发送方使使用NCBDGSEND命令发送送数据报报,接收收方使用用NCBDGRECV命令接收收数据。。通常情况况下,数数据报发发送采用用同步((等待))方式,,而数据据报接收收则采用用异步((非等待待)方式式,发送送和接收收的数据据报最大大长度为为512字节,,多余部部分将会会被丢弃弃。数据报发发送函数数DatagramSend(()NCB输入:ncb__command=NCBDGSENDncb__num:本地名字字号(发发送方为为自己注注册的名名字编号号)ncb__callname:接收方的的NetBIOS名字ncb__buffer:指向发送送缓冲区区的指针针ncb__length:发送缓冲冲区的长长度(1~512字节节)NCB输出:ncb__cmd_cplt:命令的最最终返回回码,成成功为NRC__GOODRETvoidDatagramSend(PNCBpncb,,UCHAR**DestName,UCHARNum,,UCHAR*pBuffer,WORDLength){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBDGSEND;;strcpy(((char**)pncb->ncb__callname,,(char**))DestName));pncb->ncb__num=Num;pncb->ncb__buffer=pBuffer;;pncb->ncb__length=Length;Netbios(pncb));}数据报接接收函数数DatagramRecv()NCB输入:ncb__command=NCBDGRECV|ASYNCHncb__num:本地名字字号(接接收方为为自己注注册的名名字编号号)ncb__callname:发送方的的NetBIOS名字ncb__buffer:指向接收收缓冲区区的指针针ncb__length:接收缓冲冲区的长长度(1~512字节节)ncb__event:指定异步步命令完完成后需需触发的的事件句句柄,同同步命令令为“空空”NCB输出:ncb__cmd_cplt:命令的最最终返回回码,成成功为NRC__GOODRETvoidDatagramRecv(PNCBpncb,,UCHAR**Name,UCHARNum,HANDLEhEvent,UCHAR**Buff)){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBDGRECV||ASYNCH;strcpy(((char**)pncb->ncb__callname,,(char**))Name);;pncb->ncb__num=Num;pncb->ncb__buffer=Buff;;pncb->ncb__length=512;pncb->ncb__cmd_cplt==0xff;pncb->ncb__event==hEvent;Netbios(pncb));}(1)创建事事件HANDLECreateEvent((LPSECURITY_ATTRIBUTESlpEvent,,//安全属性性BOOLbManuaReset,///是否人工工重置BOOLbInitialState,///初始是否否有信号号状态LPCTSTRlpName///名字)DWORDWaitForSingleObject((HANDLEhHandle,,DWORDdwMilliseconds)hHandle:同步对象象句柄dwMilliseconds:以毫秒为为单位的的超时间间隔hEvent==CreateEvent((NULL,FALSE,FALSE,NULL);if(hEvent===NULL))return;;….DatagramRecv((&RecvNcb,,(UCHAR*))RemoteName,LocalNameNum,,hEvent,buff));WaitForSingleObject(hEvent,0xffffffff);简单数据据报通信信程序示示例发送方““abc””不断给接接收方““xyz””发送数据据(数据据内容由由用户指指定),,双方直直到收到到一条““exit”消息后停停止通信信。数据报发发送程序序数据报接接收程序序程序说明明1、发送送方程序序采用循循环发送送结构,,接收方方程序采采用循环环接收结结构。当当发送方方从键盘盘上键入入一个字字符串后后,发送送程序将将该字符符串作为为数据报报直接发发送给接接收方,,接收方方在收到到一个数数据报后后,将收收到的字字符串显显示在屏屏幕上,,如果发发送方键键入的是是“exit”,则通信双双方结束束通信,,程序退退出。2、接收收方程序序用到了了两个WindowsAPI函数:创创建事件件函数CreateEvent())和等待事事件函数数WaitForSingleObject(),,利用这两两个函数数的目的的是用来来配合处处理异步步接收命命令。2.3..2组组播与与广播通通信程序序组播通信信程序设设计:组播通信信与点对对点通信信程序的的结构类类似,所所用的发发送和接接收命令令也相同同,只是是发送方方在指定定接受方方的名字字时应设设置为特特定的远远程组名名,而多多个接收收方均应应使用相相同的组组名来设设置接收收。这样样,只要要发送方方发送一一个特定定的组播播数据报报,那些些以特定定组名等等待接收收的进程程均能同同时接收收到这个个组播数数据报。。课堂练习习作业1:拟写程程序实现现组播通通信。发送方接接收工作作组ResetNcb())AddName()Send()DeleteName()ResetNcb())AddGRName(()Recv()DeleteName()发送数据据报到工工作组作业一P56页页2.32..42.52.62.10广播通信信程序设设计:广播通信信与组播播通信略略有不同同,主要要差别在在于:1.广广播发送送与接收收应采用用特定的的广播命命令,广广播发送送用NCBDGSENDBC命令,而而广播接接收用NCBDGRECVBC命令2.由由于所有有工作站站均接收收广播消消息,因因此发送送方在发发送广播播数据报报时无需需指定ncb__callname的值。利用广播播通信实实现时间间同步程程序示例例假设有一一个标准准时间服服务器,,当网内内一个工工作站发发出“对对时”请请求数据据报后,,标准时时间服务务器便以以广播方方式发送送一个标标准时间间,以同同步局域域网内所所有工作作站的基基准时间间。时间服务务器工作站ResetNcb())AddName()SendBaseTime(()DeleteName()ResetNcb())AddName()RecvBaseTime(()DeleteName()请求基准准时间WaitTimeRequest(()发送基准准时间RequestSystemTime())voidSendBaseTime(PNCBpncb,,UCHARNum,CHAR*pBuffer,WORDLength){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBDGSENDBC;pncb->ncb__num=Num;pncb->ncb__buffer=pBuffer;;pncb->ncb__length=Length;Netbios(pncb));}注:不需需要指定定接收方方名字voidRecvBaseTime(PNCBpncb,,UCHARNum,UCHAR**pBuffer)){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBDGRECVBC;pncb->ncb__num=Num;pncb->ncb__buffer=pBuffer;;pncb->ncb__length=512;pncb->ncb__cmd_cplt==0xff;Netbios(pncb));}补充:NCBASTAT命令测试网络络中任一一个目前前正在工工作的工工作站的的网络适适配器状状态。NCB输入:ncb__command=NCBASTATncb__callname:工作站名名字ncb__lana_num:指定要执执行命令令的LANA编号ncb__buffer:状态缓冲冲区指针针ncb__length:状态缓冲冲区长度度NCB输出:ncb__cmd_cplt:命令的最最终返回回码,成成功为NRC__GOODRET(0)UCHARAstatus(UCHARlana,,PVOIDpBuffer,,intcbBuffer,char*szName)){NCBncb;ZeroMemory(&ncb,,sizeof(NCB)));ncb..ncb_command==NCBASTAT;;ncb..ncb_lana__num=lana;;ncb..ncb_buffer=((PUCHAR)pBuffer;;ncb..ncb_length=cbBuffer;strcpy(((char**)ncb..ncb_callname,szName);;Netbios(&ncb));return((ncb.ncb_cmd__cplt);;}2.4会会话话通信程程序设计计会话是一一种面向向连接的的可靠通通信方式式。与数数据报相相比,会会话通信信可以保保证数据据的完整整性、抵抵达顺序序及传输输的可靠靠性。一一般分成成三个阶阶段:建立连接接数据传输输断开连接接基于NetBIOS的会话通通信模型型服务器客户机ResetNcb()AddName()Listen()HangUp()ResetNcb()AddName()Call()HangUp()建立会话连接Send/Recv()Recv/Send会话通信DeleteName()DeleteName()关闭会话NetBIOS的会话话通信步步骤①初始化。。通信双双方分别别执行NCBRESET命令,复复位各自自的NetBIOS。②添加名字字。为了了建立会会话,通通信双方方应分别别执行NCBADDNAME命令,在在各自的的本地名名字表中中添加唯唯一名。。NetBIOS的会话话通信步步骤③建立会话话。在进进行会话话通信之之前,必必须首先先建立一一个会话话连接。。该过程程需由服服务器和和客户机机协同完完成,服服务器方方使用NCBLISTEN命令等待待客户机机的连接接请求,,客户方方使用NCBCALL命令向服服务器发发起会话话连接请请求。一一旦会话话建立成成功,在在双方的的NetBIOS接口上便便会建立立一个会会话,并并分别为为会话双双方赋予予唯一的的会话号号,以后后通信双双方就可可以利用用该会话话号进行行会话通通信。NetBIOS的会话话通信步步骤④数据传输输。会话话建立后后,双方方便可利利用NCBSEND和NCBRECV等会话命命令进行行会话通通信。⑤拆除会话话。当数数据传输输结束后后,任何何一方均均可发出出NCBHANGUP命令来拆拆除指定定会话号号上的会会话连接接,以及及时释放放系统资资源。⑥删除名字字。在会会话通信信进行结结束后,,双方还还应删除除各自本本地名字字表中的的名字。。会话通信信命令NetBIOS的会话通通信命令令共有9条,每每条命令令都有等等待和非非等待两两种方式式,通常常情况下下发送方方采用等等待方式式,而接接收方则则采用非非等待方方式。(1)发发起连接接请求Call命令命令代码码:NCBCALL,NCBCALL||ASYNCH命令功能能:请求求与某个个远程工工作站建建立一个个会话NCB输入:ncb__command=NCBCALL或NCBCALL|ASYNCHncb__name:本地名字字ncb__callname:远程名字字ncb__rto:接收时限限(以0.5s为单位))ncb__sto:发送时限限(以0.5s为单位))ncb__event:指定异步步命令完完成后需需触发的的事件句句柄,同同步命令令时为““空”NCB输出:ncb__lsn:分配的本本地会话话号ncb__cmd_cplt::命令的最最终返回回码注意:1、要在在两个名名字之间间真正建建立会话话,对方方必须已已经发出出Listen命令才行行。如果果Call命令成功功,NetBIOS即返回一一个本地地会话号号LSN,,供后面的的会话通通信命令令引用。。如果Call命令呼叫叫的对方方没有发发出Listen命令,那那么Call命令会反反复试几几次,最最后返回回出错信信息。2、在会会话过程程中发送送超时和和接收超超时的时时限应在在Call命令中指指定,而而不是在在后面的的发送//接收命命令中指指定的。。ncb__sto(发送时限限)和ncb__rto(接收时限限)两个个字段的的值是以以0.5s为单位的的,若设设为“0”表示示没有超超时机制制,即可可以无限限期等待待,这一一点在使使用时要要非常小小心。voidNetbiosCall(PNCBpncb,charSourName[],,charDestName[]]){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBCALL;strcpy(((char**)pncb->ncb__name,SourName);;strcpy(((char**)pncb->ncb__callname,,DestName));pncb->ncb__rto=0;;pncb->ncb__sto=10;Netbios(pncb));}(2)侦侦听连接接请求Listen命令命令代码码:NCBLISTEN、、NCBLISTEN||ASYNCH命令功能能:侦听听远程工工作站的的会话呼呼叫(Call)请求,建建立一个个会话。。NCB输入:ncb__command=NCBLISTEN或NCBLISTEN||ASYNCHncb__name:本地名字字ncb__callname:呼叫方的的名字,,“*””表示可可以响应应任何站站对本站的呼呼叫ncb__rto:接收时限限(以0.5s为单位))ncb__sto:发送时限限(以0.5s为单位))ncb__event:指定异步步命令完完成后需需触发的的事件句句柄,同同步命令令时为““空”NCB输出:ncb__lsn:分配的本本地会话话号ncb__cmd_cplt::命令的最最终返回回码注意:1、ncb__callname字段的第第一个字字节为**号号,则可可以响应应任何站站对本站站的呼叫叫。如果果Listen命令成功功,NetBIOS就会返回回一个本本地会话话号lsn,,供后面的的发送、、接收、、挂机命命令引用用。2、Call/Listen命令可以以多次被被使用,,在同一一对命令令间建立立多个会会话。3、Listen命令是没没有超时时机制的的,应避避免使用用Wait方式,否否则有可可能产生生无限等等待。4、在会会话过程程中发送送超时和和接收超超时的时时限应在在Listen命令中指指定。voidNetbiosListen((PNCBpncb,HANDLEhEvent,,charSourName[]],charDestName[[]){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBLISTEN||ASYNCH;strcpy(((char**)pncb->ncb__name,SourName);;strcpy(((char**)pncb->ncb__callname,,DestName));pncb->ncb__rto=0;;pncb->ncb__sto=5;;pncb->ncb__cmd_cplt==0xff;pncb->ncb__event==hEvent;Netbios(pncb));}(3)数数据发送送Send命令命令代码码:NCBSEND、NCBSEND|ASYNCH命令功能能:向指指定的会会话方发发一个长长度为1~65535字节的的消息NCB输入:ncb__command=NCBSEND或NCBSEND|ASYNCHncb__lsn:本地会话话号ncb__buffer:指定要发发送数据据的缓存存地址ncb__length:要发送数数据的字字节数ncb__event:指定异步步命令完完成后需需触发的的事件句句柄,同同步命令令时为““空”NCB输出:ncb__cmd_cplt::命令的最最终返回回码注意:发发送的时时限是在在Call或Listen中指定的的,如果果超时的的时候对对方还没没有收到到数据,,则会话话非正常常终止,,返回超超时出错错信息。。此外,,不论何何种原因因造成Send不能完成成,都会会使会话话终止,,返回响响应的出出错信息息。voidSessionSend(PNCBpncb,UCHARNum,,UCHAR**pBuffer,WORDLength){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBSEND;pncb->ncb__lsn=Num;pncb->ncb__buffer=pBuffer;;pncb->ncb__length=Length;Netbios(pncb));}(4)数数据接收收Receive命令命令代码码:NCBRECV、NCBRECV|ASYNCH命令功能能:接收收由会话话方发过过来的数数据。NCB输入:ncb__command=NCBSEND或NCBSEND|ASYNCHncb__lsn:本地会话话号ncb__buffer:接收缓存存区指针针ncb__length:接收缓冲冲区长度度ncb__event:指定异步步命令完完成后需需触发的的事件句句柄,同同步命令令时为““空”NCB输出:ncb__length:实际收到到的字节节数ncb__cmd_cplt::命令的最最终返回回码注意:接接收的时时限是在在Call或Listen中指定的的,如果果接收超超时,不不会引起起会话终终止。如如果给Recevie命令规定定的缓存存长度小小于要接接收的数数据长度度,则会会发生错错误,这这时可以以再发一一条Receive命令,接接收剩余余的数据据(但必必须在超超时之前前完成))voidSessionRecv(PNCBpncb,UCHARNum,,HANDLEhEvent,UCHAR**pBuffer)){memset((pncb,0,sizeof(NCB)));pncb->ncb__command=NCBRECV|ASYNCH;pncb->ncb__lsn=Num;pncb->ncb__buffer=pBuffer;;pncb->ncb__length=512;pncb->ncb__cmd_cplt==0xff;pncb->ncb__event==hEvent;Netbios(pncb));}(5)关关闭会话话HangUp命令命令代码码:NCBHANGUP、、NCBHANGUP||ASYNCH命令功能能:在会会话结束
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年北京市东城区高三物理上册期中考试试卷及答案
- 2025-2026学年安徽省亳州市高一生物上册期中考试试卷及答案
- 暑期安全协议书
- 面部表情评估法
- 肝癌患者化疗术后消化护理指南
- 咖啡创意课件模板
- 营养健康早餐分享
- 设施选址常用方法
- 酒店结束营业员工聚餐
- 儿童座椅设计要点解析
- 整本书阅读《平凡的世界》(教学课件)
- DB11-T 1448-2017 城市轨道交通工程资料管理规程
- 三年级数学小学数学答题卡模板
- 《巴托克钢琴作品《小宇宙》的作曲技法分析》
- GB/T 25738-2024核电厂电动机调试技术导则
- GB/T 8574-2024复合肥料中钾含量的测定
- 湖北工程学院《西方哲学史》2023-2024学年第一学期期末试卷
- 2024购物中心场地租赁合同
- 2024年黑龙江省哈尔滨市中考英语试题卷(含答案及解析)
- 七年级上册语文《陈太丘与友期行》课件
- 护士中级职称竞聘述职课件
评论
0/150
提交评论