您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第3章基于NetBIOS的网络编程
Windows网络编程技术第3章基于NetBIOS的网络编程授课老师:胡鸣数学与计算机学院计算机系本章提纲•3.1基于NetBIOS网络编程的基础–3.1.1网络应用实例和来源–3.1.2NetBIOS提供的接口与服务–3.1.3网络控制块NCB的应用•3.2数据报通信编程–3.2.1数据报通信应用模型–3.2.2实例中的广播式数据报通信算法与实现–3.2.3实例中的定向型数据报通信的算法与实现•3.3会话通信编程–3.3.1会话通信应用模型–3.3.2实例中会话服务器的算法与实现–3.3.3实例中会话客户算法与实现3.1.1网络应用实例和来源•VC++实现的控制台程序,位于“第3章代码”中,其源程序代码由cnetbios.h和CnetbiosChat.cpp两部分组成•两个界面:初始界面和功能操作界面•程序使用命令提示符$,界面上可以提供用户操作的命令有五种:Lookup(了解本地命名和适配器信息)、session(会话建立与通信)、sendtoname(发送单播和组播数据包)、sendtoall(发送广播通信)、exit(退出)•键入非命令字符串,则提示初始界面功能操作界面Lookupsession会话服务器会话客户sendtonamesendtoall3.1.2NetBIOS提供的接口与服务•网络基本输入/输出系统NetBIOS(NetworkBasicInput/OutputSystem)在支持三个传输协议(NetBEUI、TCP/IP和IPX/SPX)的基础上提供了标准接口;•应用程序通过引用网络控制块NCB(NetworkControlBlock)作为参数调用函数:UCHARNetbios(PNCBpNCB);•NetBIOS支持的服务:网络名字注册和验证、会话服务、无连接的数据报服务、协议和适配器的监视与管理、支持三种软件调用Netbios函数:同步、异步和回调NBF——NetBIOSFrames,NetBEUI(NetBIOSExtendedUserInterface)协议,IBM和Microsoft为小型局域网建立的不可路由协议,不适合广域网。针对TCP/IP也称NBT(NetBIOSoverTCP/IP)IPX(InternetworkPacketExchange)/SPXSequencesPacketExchange(顺序包交换)NovellNetWare操作系统使用的网络层协议,路由协议没有IP丰富,设置简单。但IPX协议在以太网上运行时必须指定封装形式。TDI(TransportDriverInterface)传输驱动接口函数Netbios(PNCBpNCB)#defineNetbiosInt5c((unsignedchar)0x5C)#defineNetbiosInt2AFunctionCode((unsignedchar)0x2A)voidNetbios(structNCB*NcbPtrNear){UnionREGSInRegs,OutRegs;structNCBfar*NcbPtrFar=(structNCB*far)NcbPtrNear;segread(&SegRegs);SegRegs.es=FP_SEG(NcbPtrFar);SegRegs.x.bx=FP_OFF(NcbPtrFar);Int86x(NetbiosInt5c,&InRegs,&OutRegs,&SegRegs);}网络名字注册和验证•名字解析系统有LMHOSTS文件和WINS(WindowsInternetNameService)服务器两个选项•类型有唯一名,组名,永久节点名(网卡地址),符号名。•为每个LANA编号维护一个命名表,名字(最多16个字节)与一个字节的命名编号(1-254)对应•LANA编号描述网卡和传输协议(3个),例如两个网卡以及三种协议–0(TCP/IP,网卡1)、1(NetBEUI,网卡1)、2(IPX/SPX,网卡1)、3(TCP/IP,网卡2)、4(NetBEUI,网卡2)、5(IPX/SPX,网卡2)会话服务•呼叫功能用于建立一条与被呼叫的应用进程之间的会话连接•一旦连接建立,就某个LANA编号有了一条虚电路用NetBIOS本地会话号(1-254,0和255作为系统保留值)来识别。•会话数据发送和接收都是基于所建立的虚电路,因此除了指定收发缓冲区的指针和缓冲区的长度外,还需要指定的本地会话号和LANA编号。•通信结束释放已有连接,同时释放进程占用的内存单元,即本地会话号对应的表。无连接的数据报服务•NetBIOS提供单播、组播和广播三种数据报传送功能•NetBIOS单播和组播信息发送都是基于名字,因此单播与组播的区分取决于接收方的名字是唯一名还是组名,而发送进程则需要指定本地名字编号和LANA编号。接收进程要区分单播和组播,名字编号是关键,如果不区分,则用通用名字号(0xff),否则唯一名编号接收为单播,组名编号接收为组播。•广播的接收和发送采用单独的命令,不过还是以应用进程注册名和LANA编号为基础。同步、异步和回调•同步调用是一种阻塞的单向调用方式,调用方必须一直等待Netbios函数完成功能返回;•异步调用是一种非阻塞的单向调用方式,Netbios函数调用后立即返回,调用双方可以各自继续完成自己工作,NetBIOS接口提供事件触发以便通知调用方被调用方已经Netbios函数完成工作;•回调是一种非阻塞的双向调用方法,调用方设置Netbios函数完成工作后的程序地址,以便被调用方完成工作后执行预先设置的那个程序。回调函数示例typedefint(__stdcall*PFunc)(int,int);int__stdcallMax(inta,intb){returnab?a:b;}int__stdcallTest(PFuncfunc,inta,intb){returnfunc(a,b);}voidmain(){coutTest(Max,1,30)endl;}3.1.3网络控制块NCB的应用•用#includenb30.h和#pragmacomment(lib,“netapi32.lib”)(或通过项目菜单)加入头文件和库文件•所有NetBIOS网络功能实现的关键就是Netbios函数的调用,而不同功能实现的关键是该函数引用参数NCB结构各个域的取值不同•同样的函数Netbios,同样的参数NCB结构指针,要实现不同的功能,就必须对NCB结构成员初始化。•通过对NCB结构成员ncb_command赋值来完成等待(同步)和非等待(回调和异步)两种调用方式中选择参数NCB结构Typedefstruct_NCB{UCHARncb_command;UCHARncb_retcode;UCHARncb_lsn;UCHARncb_num;PUCHARncb_buffer;WORDncb_length;UCHARncb_callname[NCBNAMSZ];UCHARncb_name[NCBNAMSZ];UCHARncb_rto;UCHARncb_sto;void(CALLBACK*ncb_post)(struct_NCB*);UCHARncb_lana_num;UCHARncb_cmd_cplt;UCHARncb_reserve[10];HANDLEncb_event;}NCB,*PNCBNCB结构成员初始化举例UCHARRestNCB(UCHARjiangxue_lana){NCBjiangxue_ncb;memset(&jiangxue_ncb,0,sizeof(NCB));jiangxue_ncb.ncb_command=NCBRESET;jiangxue_ncb.ncb_callname[0]=MAXSESSIONS;jiangxue_ncb.ncb_callname[2]=MAXNAMES;jiangxue_ncb.ncb_lana_num=jiangxue_lana;Netbios(&jiangxue_ncb);NBCheck(jiangxue_ncb)return(jiangxue_ncb.ncb_cmd_cplt);}非等待调用选择•非等待调用赋值时增加|ASYNCH(表示将该字节的最高位置1),而等待调用不需要;例如,pncb-ncb_command=NCBDGSEND|ASYNCH表示数据报发送命令采用非等待调用方式;•异步方式通过NCB结构成员ncb_event指定事件的句柄,让Netbios函数完成命令后触发一个事件;•回调方式是将处理程序的地址(回调函数)通过NCB结构成员ncb_post,让Netbios函数命令完成后唤醒该程序;•一般回调函数定义如下:voidCALLBACK回调函数名(PNCB);其中回调函数的参数指向的NCB就是命令执行完成后的NCB结构。3.2.1数据报通信应用模型定向型数据报通信模型广播式数据报通信模型3.2.2实例中的广播式数据报通信算法与实现•不论是广播式数据报通信还是定向型数据报,都要获取可用适配器网络编号并完成通信的初始化。•接下来是唯一名LocalName和组名GroupName的注册,注册成功后返回相应唯一名字号NameNum和组名字号GroupNameNum。•创建线程DGRecvBCTread用于实现广播数据报接收过程。•定义了PdataGram结构指针,其结构的成员flag定义了Online,Offline,Listen和Message四种消息类型。•键入命令sendtoall后调用DGsendBCCMD(Elana[0],NameNum)函数发送广播消息。提示进程用户“pleaseinputmessagetobroadcast:”,键入发送的消息,设置消息标志flag为Message,然后调用函数DatagramSendBC(lana,NameNum,(char*)pdata,len)发送键入的消息内容,其中lana为LANA编号,NameNum为本地名字号。•在退出命令exit的处理中,终止接收线程DGRecvBCTread。然后发送广播消息,告诉其他在线应用进程,本应用进程下线,并关闭线程对象,然后调用函数DeleteName(注册的名字,Elana[0])删除注册的组名和唯一名。3.2.3实例中的定向型数据报通信的算法与实现•初始化与名字注册同上一小节•创建接收线程GDGRecvTread和SDGRecvTread接收组播和单播消息•第二个参数不同,前者为注册的组名绑定的名字号GroupNameNum,后者为注册名绑定的名字号。前者收到信息后,屏幕提示“Multicastingsender‘sname:组播发送进程注册名”和“thecontentofmessage:收到的消息内容”。•在用户操作命令提示($)下,键入命令“sendtoname”回车后,程序提示应用进程的用户键入接收应用进程注册的唯一名或组名•屏幕提示“pleaseinputmessagetosendtothename接收进程注册的唯一名或组名:”发送进程的用户键入要发送的消息回车后,该函数调用SDGSend函数发送该消息内容。•SDGSend函数在cnetbios.h中有定义,并且有5个参数:可用的LANA编号lana,接收进程注册的唯一名或组名DestName,发送进程注册名绑定的名字号NameNum,要发送消息缓冲区的指针(char*)pdata和发送缓冲区的长度len。3.3.1会话通信应用模型会话通信模型3.3.2实例中会话服务器的算法与实现•初始化与名字注册同上一节;•键入session操作命令后,提示用户信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,如果键入“*”字符,则该应用进程作为服务器•该进程设置消息标志pdata-flag为Listen,并用函数DatagramSendBC(Elana[0],Nam
本文标题:第3章基于NetBIOS的网络编程
链接地址:https://www.777doc.com/doc-2193212 .html