第3章基于NetBIOS的网络编程课件_第1页
第3章基于NetBIOS的网络编程课件_第2页
第3章基于NetBIOS的网络编程课件_第3页
第3章基于NetBIOS的网络编程课件_第4页
第3章基于NetBIOS的网络编程课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

Windows网络编程技术

第3章基于NetBIOS的网络编程授课老师:胡鸣数学与计算机学院计算机系Windows网络编程技术

第3章基于NetBIOS的网络编1本章提纲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基于NetBIOS网络编程的基础23.1.1网络应用实例和来源VC++实现的控制台程序,位于“第3章代码”中,其源程序代码由cnetbios.h和CnetbiosChat.cpp两部分组成两个界面:初始界面和功能操作界面程序使用命令提示符$,界面上可以提供用户操作的命令有五种:Lookup(了解本地命名和适配器信息)、session(会话建立与通信)、sendtoname(发送单播和组播数据包)、sendtoall(发送广播通信)、exit(退出)键入非命令字符串,则提示3.1.1网络应用实例和来源VC++实现的控制台程序,位于“3初始界面初始界面4功能操作界面功能操作界面5LookupLookup6session会话服务器session会话服务器7会话客户会话客户8sendtonamesendtoname9sendtoallsendtoall103.1.2NetBIOS提供的接口与服务网络基本输入/输出系统NetBIOS(NetworkBasicInput/OutputSystem)在支持三个传输协议(NetBEUI、TCP/IP和IPX/SPX)的基础上提供了标准接口;应用程序通过引用网络控制块NCB(NetworkControlBlock)作为参数调用函数:UCHARNetbios(PNCBpNCB);NetBIOS支持的服务:网络名字注册和验证、会话服务、无连接的数据报服务、协议和适配器的监视与管理、支持三种软件调用Netbios函数:同步、异步和回调3.1.2NetBIOS提供的接口与服务网络基本输入/输出系11NBF——NetBIOSFrames,NetBEUI(NetBIOSExtendedUserInterface)协议,IBM和Microsoft为小型局域网建立的不可路由协议,不适合广域网。针对TCP/IP也称NBT(NetBIOSoverTCP/IP)IPX(InternetworkPacketExchange)/SPXSequencesPacketExchange(顺序包交换)NovellNetWare操作系统使用的网络层协议,路由协议没有IP丰富,设置简单。但IPX协议在以太网上运行时必须指定封装形式。TDI(TransportDriverInterface)传输驱动接口NBF——NetBIOSFrames,NetBEUI(Ne12函数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);}函数Netbios(PNCBpNCB)#defineNe13网络名字注册和验证名字解析系统有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)网络名字注册和验证名字解析系统有LMHOSTS文件和WIN14会话服务呼叫功能用于建立一条与被呼叫的应用进程之间的会话连接一旦连接建立,就某个LANA编号有了一条虚电路用NetBIOS本地会话号(1-254,0和255作为系统保留值)来识别。会话数据发送和接收都是基于所建立的虚电路,因此除了指定收发缓冲区的指针和缓冲区的长度外,还需要指定的本地会话号和LANA编号。通信结束释放已有连接,同时释放进程占用的内存单元,即本地会话号对应的表。会话服务呼叫功能用于建立一条与被呼叫的应用进程之间的会话连接15无连接的数据报服务NetBIOS提供单播、组播和广播三种数据报传送功能NetBIOS单播和组播信息发送都是基于名字,因此单播与组播的区分取决于接收方的名字是唯一名还是组名,而发送进程则需要指定本地名字编号和LANA编号。接收进程要区分单播和组播,名字编号是关键,如果不区分,则用通用名字号(0xff),否则唯一名编号接收为单播,组名编号接收为组播。广播的接收和发送采用单独的命令,不过还是以应用进程注册名和LANA编号为基础。无连接的数据报服务NetBIOS提供单播、组播和广播三种数据16同步、异步和回调同步调用是一种阻塞的单向调用方式,调用方必须一直等待Netbios函数完成功能返回;异步调用是一种非阻塞的单向调用方式,Netbios函数调用后立即返回,调用双方可以各自继续完成自己工作,NetBIOS接口提供事件触发以便通知调用方被调用方已经Netbios函数完成工作;回调是一种非阻塞的双向调用方法,调用方设置Netbios函数完成工作后的程序地址,以便被调用方完成工作后执行预先设置的那个程序。同步、异步和回调同步调用是一种阻塞的单向调用方式,调用方必须17回调函数示例typedefint(__stdcall*PFunc)(int,int);

int

__stdcall

Max(inta,intb)

{return

a>b?a:b;

}

int__stdcallTest(PFuncfunc,inta,

intb)

{

return

func(a,

b);

}

void

main()

{

cout<<Test(Max,1,30)<<endl;

}

回调函数示例typedefint(__stdcall183.1.3网络控制块NCB的应用用#include<nb30.h>和#pragmacomment(lib,“netapi32.lib”)(或通过项目菜单)加入头文件和库文件所有NetBIOS网络功能实现的关键就是Netbios函数的调用,而不同功能实现的关键是该函数引用参数NCB结构各个域的取值不同同样的函数Netbios,同样的参数NCB结构指针,要实现不同的功能,就必须对NCB结构成员初始化。通过对NCB结构成员ncb_command赋值来完成等待(同步)和非等待(回调和异步)两种调用方式中选择3.1.3网络控制块NCB的应用用#include<nb319参数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,*PNCB参数NCB结构Typedefstruct_NCB{UC20NCB结构成员初始化举例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);}NCB结构成员初始化举例UCHARRestNCB(UCHA21非等待调用选择非等待调用赋值时增加|ASYNCH(表示将该字节的最高位置1),而等待调用不需要;例如,pncb->ncb_command=NCBDGSEND|ASYNCH表示数据报发送命令采用非等待调用方式;异步方式通过NCB结构成员ncb_event指定事件的句柄,让Netbios函数完成命令后触发一个事件;回调方式是将处理程序的地址(回调函数)通过NCB结构成员ncb_post,让Netbios函数命令完成后唤醒该程序;一般回调函数定义如下:voidCALLBACK回调函数名(PNCB);其中回调函数的参数指向的NCB就是命令执行完成后的NCB结构。非等待调用选择非等待调用赋值时增加|ASYNCH(表示将该字223.2.1数据报通信应用模型定向型数据报通信模型3.2.1数据报通信应用模型定向型数据报通信模型23广播式数据报通信模型广播式数据报通信模型243.2.2实例中的广播式数据报通信算法与实现不论是广播式数据报通信还是定向型数据报,都要获取可用适配器网络编号并完成通信的初始化。接下来是唯一名LocalName和组名GroupName的注册,注册成功后返回相应唯一名字号NameNum和组名字号GroupNameNum。创建线程DGRecvBCTread用于实现广播数据报接收过程。定义了PdataGram结构指针,其结构的成员flag定义了Online,Offline,Listen和Message四种消息类型。3.2.2实例中的广播式数据报通信算法与实现不论是广播式数据25键入命令sendtoall后调用DGsendBCCMD(Elana[0],NameNum)函数发送广播消息。提示进程用户“pleaseinputmessagetobroadcast:”,键入发送的消息,设置消息标志flag为Message,然后调用函数DatagramSendBC(lana,NameNum,(char*)pdata,len)发送键入的消息内容,其中lana为LANA编号,NameNum为本地名字号。在退出命令exit的处理中,终止接收线程DGRecvBCTread。然后发送广播消息,告诉其他在线应用进程,本应用进程下线,并关闭线程对象,然后调用函数DeleteName(注册的名字,Elana[0])删除注册的组名和唯一名。键入命令sendtoall后调用DGsendBCCMD(El263.2.3实例中的定向型数据报通信的算法与实现初始化与名字注册同上一小节创建接收线程GDGRecvTread和SDGRecvTread接收组播和单播消息第二个参数不同,前者为注册的组名绑定的名字号GroupNameNum,后者为注册名绑定的名字号。前者收到信息后,屏幕提示“Multicastingsender‘sname:组播发送进程注册名”和“thecontentofmessage:收到的消息内容”。在用户操作命令提示($)下,键入命令“sendtoname”回车后,程序提示应用进程的用户键入接收应用进程注册的唯一名或组名3.2.3实例中的定向型数据报通信的算法与实现初始化与名字注27屏幕提示“pleaseinputmessagetosendtothename接收进程注册的唯一名或组名:”发送进程的用户键入要发送的消息回车后,该函数调用SDGSend函数发送该消息内容。SDGSend函数在cnetbios.h中有定义,并且有5个参数:可用的LANA编号lana,接收进程注册的唯一名或组名DestName,发送进程注册名绑定的名字号NameNum,要发送消息缓冲区的指针(char*)pdata和发送缓冲区的长度len。屏幕提示“pleaseinputmessagetos283.3.1会话通信应用模型会话通信模型3.3.1会话通信应用模型会话通信模型293.3.2实例中会话服务器的算法与实现初始化与名字注册同上一节;键入session操作命令后,提示用户信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,如果键入“*”字符,则该应用进程作为服务器该进程设置消息标志pdata->flag为Listen,并用函数DatagramSendBC(Elana[0],NameNum,(char*)pdata,len)发送广播消息,通知其他在线进程,本进程作为服务器。在while循环体中,首先服务器进程调用NetbiosListen(Elana[0],pncb,LocalName)函数被动监听任何客户进程的连接请求。3.3.2实例中会话服务器的算法与实现初始化与名字注册同上一30接收一个客户进程的连接请求后,调用函数ServerSession(pncb)处理连接请求,将连接客户进程的注册名送入DestName中,然后创建会话数据接收线程SessionReceiveThread,同时指定该线程的调用参数(PVOID)pncb。屏幕显示“本地服务器进程注册名hasacceptedtheconnectionto远端客户进程注册名!”,然后休息片刻,发送数据“WelcometoServer!”给客户进程,屏幕提示用户“Whenyousendamessagetotheotherparty,themessage"exit"meansstoppingtosend!”,告诉用户当键入消息“exit”时,停止发送。然后进入发送循环。接收一个客户进程的连接请求后,调用函数ServerSessi31在for(;;)循环体中,提示服务器进程用户“pleaseinputmessagetosendto客户进程注册名:”键入的消息。如果用户键入“exit”,则服务器进程终止会话数据接收线程SessionReceiveThread,关闭线程句柄对象,断开连接,然后退出循环;如果不是,则调用函数SessionSend(Elana[0],SessionNum,sbuffer,sizeof(sbuffer))发送数据,发送结束后,并判断返回retcode,如果不是成功结束,表示对方已经关闭连接,退出循环。当连接请求处理完毕后,服务器进程提示用户“Ifyouneedlistentothenext,pleasetypetheletter"y":”,如果用户键入“y”则服务器进程进入下一轮循环,否则退出循环,回到用户操作命令提示状态$等待用户键入下一条命令。在for(;;)循环体中,提示服务器进程用户“please323.3.3实例中会话客户算法与实现初始化与名字注册同上一节;消息“Theserver服务器进程注册名iswaitingforaclienttoconnect!”显示告诉用户有服务器进程等待连接。操作命令提示符$下键入操作命令session回车后,用户进程提示信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,用户键入服务器注册名如果连接请求成功,则转入客户连接处理函数ClientSession(pncb),否则屏幕提示用户“Theserver服务器注册名isn'tlistening!”表示连接服务器进程失败。3.3.3实例中会话客户算法与实现初始化与名字注册同上一节;33像服务器处理连接函数ServerSession一样创建会话数据接收线程SessionReceiveThread,同时指定该线程的调用参数(PVOID)pncb。屏幕显示“本地客户进程注册名hasconnectedtotheserver远端服务器进程注册名!”然后屏幕提示用户“Whenyousendamessagetotheotherparty,themessage”exit“meansstoppingtosend!”,告诉用户当键入消息“exit”时,停止发送。然后进入发送循环。在for(;;)循环体中,收到服务器进程发来的消息“WelcometoServer!”,并在屏幕上显示,并提示客户进程用户“pleaseinputmessagetosendto服务器进程注册名:”用户进入消息存放在缓冲区cbuffer内。像服务器处理连接函数ServerSession一样创建会话数34如果用户键入“exit”,则客户进程终止会话数据接收线程SessionReceiveThread,关闭线程句柄对象,断开连接,然后退出循环;如果不是键入“exit”,则调用函数SessionSend(Elana[0],SessionNum,sbuffer,sizeof(sbuffer))发送缓冲区sbuffer的数据,发送结束后,并判断返回retcode,如果不是成功结束,则表示对方已经关闭连接,则退出循环。发送成功结束后,提示客户进程用户“pleaseinputmessagetosendto服务器进程注册名:”进入下一轮循环,以便用户键入消息。如果用户键入“exit”,则客户进程终止会话数据接收线程Se35Windows网络编程技术

第3章基于NetBIOS的网络编程授课老师:胡鸣数学与计算机学院计算机系Windows网络编程技术

第3章基于NetBIOS的网络编36本章提纲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基于NetBIOS网络编程的基础373.1.1网络应用实例和来源VC++实现的控制台程序,位于“第3章代码”中,其源程序代码由cnetbios.h和CnetbiosChat.cpp两部分组成两个界面:初始界面和功能操作界面程序使用命令提示符$,界面上可以提供用户操作的命令有五种:Lookup(了解本地命名和适配器信息)、session(会话建立与通信)、sendtoname(发送单播和组播数据包)、sendtoall(发送广播通信)、exit(退出)键入非命令字符串,则提示3.1.1网络应用实例和来源VC++实现的控制台程序,位于“38初始界面初始界面39功能操作界面功能操作界面40LookupLookup41session会话服务器session会话服务器42会话客户会话客户43sendtonamesendtoname44sendtoallsendtoall453.1.2NetBIOS提供的接口与服务网络基本输入/输出系统NetBIOS(NetworkBasicInput/OutputSystem)在支持三个传输协议(NetBEUI、TCP/IP和IPX/SPX)的基础上提供了标准接口;应用程序通过引用网络控制块NCB(NetworkControlBlock)作为参数调用函数:UCHARNetbios(PNCBpNCB);NetBIOS支持的服务:网络名字注册和验证、会话服务、无连接的数据报服务、协议和适配器的监视与管理、支持三种软件调用Netbios函数:同步、异步和回调3.1.2NetBIOS提供的接口与服务网络基本输入/输出系46NBF——NetBIOSFrames,NetBEUI(NetBIOSExtendedUserInterface)协议,IBM和Microsoft为小型局域网建立的不可路由协议,不适合广域网。针对TCP/IP也称NBT(NetBIOSoverTCP/IP)IPX(InternetworkPacketExchange)/SPXSequencesPacketExchange(顺序包交换)NovellNetWare操作系统使用的网络层协议,路由协议没有IP丰富,设置简单。但IPX协议在以太网上运行时必须指定封装形式。TDI(TransportDriverInterface)传输驱动接口NBF——NetBIOSFrames,NetBEUI(Ne47函数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);}函数Netbios(PNCBpNCB)#defineNe48网络名字注册和验证名字解析系统有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)网络名字注册和验证名字解析系统有LMHOSTS文件和WIN49会话服务呼叫功能用于建立一条与被呼叫的应用进程之间的会话连接一旦连接建立,就某个LANA编号有了一条虚电路用NetBIOS本地会话号(1-254,0和255作为系统保留值)来识别。会话数据发送和接收都是基于所建立的虚电路,因此除了指定收发缓冲区的指针和缓冲区的长度外,还需要指定的本地会话号和LANA编号。通信结束释放已有连接,同时释放进程占用的内存单元,即本地会话号对应的表。会话服务呼叫功能用于建立一条与被呼叫的应用进程之间的会话连接50无连接的数据报服务NetBIOS提供单播、组播和广播三种数据报传送功能NetBIOS单播和组播信息发送都是基于名字,因此单播与组播的区分取决于接收方的名字是唯一名还是组名,而发送进程则需要指定本地名字编号和LANA编号。接收进程要区分单播和组播,名字编号是关键,如果不区分,则用通用名字号(0xff),否则唯一名编号接收为单播,组名编号接收为组播。广播的接收和发送采用单独的命令,不过还是以应用进程注册名和LANA编号为基础。无连接的数据报服务NetBIOS提供单播、组播和广播三种数据51同步、异步和回调同步调用是一种阻塞的单向调用方式,调用方必须一直等待Netbios函数完成功能返回;异步调用是一种非阻塞的单向调用方式,Netbios函数调用后立即返回,调用双方可以各自继续完成自己工作,NetBIOS接口提供事件触发以便通知调用方被调用方已经Netbios函数完成工作;回调是一种非阻塞的双向调用方法,调用方设置Netbios函数完成工作后的程序地址,以便被调用方完成工作后执行预先设置的那个程序。同步、异步和回调同步调用是一种阻塞的单向调用方式,调用方必须52回调函数示例typedefint(__stdcall*PFunc)(int,int);

int

__stdcall

Max(inta,intb)

{return

a>b?a:b;

}

int__stdcallTest(PFuncfunc,inta,

intb)

{

return

func(a,

b);

}

void

main()

{

cout<<Test(Max,1,30)<<endl;

}

回调函数示例typedefint(__stdcall533.1.3网络控制块NCB的应用用#include<nb30.h>和#pragmacomment(lib,“netapi32.lib”)(或通过项目菜单)加入头文件和库文件所有NetBIOS网络功能实现的关键就是Netbios函数的调用,而不同功能实现的关键是该函数引用参数NCB结构各个域的取值不同同样的函数Netbios,同样的参数NCB结构指针,要实现不同的功能,就必须对NCB结构成员初始化。通过对NCB结构成员ncb_command赋值来完成等待(同步)和非等待(回调和异步)两种调用方式中选择3.1.3网络控制块NCB的应用用#include<nb354参数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,*PNCB参数NCB结构Typedefstruct_NCB{UC55NCB结构成员初始化举例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);}NCB结构成员初始化举例UCHARRestNCB(UCHA56非等待调用选择非等待调用赋值时增加|ASYNCH(表示将该字节的最高位置1),而等待调用不需要;例如,pncb->ncb_command=NCBDGSEND|ASYNCH表示数据报发送命令采用非等待调用方式;异步方式通过NCB结构成员ncb_event指定事件的句柄,让Netbios函数完成命令后触发一个事件;回调方式是将处理程序的地址(回调函数)通过NCB结构成员ncb_post,让Netbios函数命令完成后唤醒该程序;一般回调函数定义如下:voidCALLBACK回调函数名(PNCB);其中回调函数的参数指向的NCB就是命令执行完成后的NCB结构。非等待调用选择非等待调用赋值时增加|ASYNCH(表示将该字573.2.1数据报通信应用模型定向型数据报通信模型3.2.1数据报通信应用模型定向型数据报通信模型58广播式数据报通信模型广播式数据报通信模型593.2.2实例中的广播式数据报通信算法与实现不论是广播式数据报通信还是定向型数据报,都要获取可用适配器网络编号并完成通信的初始化。接下来是唯一名LocalName和组名GroupName的注册,注册成功后返回相应唯一名字号NameNum和组名字号GroupNameNum。创建线程DGRecvBCTread用于实现广播数据报接收过程。定义了PdataGram结构指针,其结构的成员flag定义了Online,Offline,Listen和Message四种消息类型。3.2.2实例中的广播式数据报通信算法与实现不论是广播式数据60键入命令sendtoall后调用DGsendBCCMD(Elana[0],NameNum)函数发送广播消息。提示进程用户“pleaseinputmessagetobroadcast:”,键入发送的消息,设置消息标志flag为Message,然后调用函数DatagramSendBC(lana,NameNum,(char*)pdata,len)发送键入的消息内容,其中lana为LANA编号,NameNum为本地名字号。在退出命令exit的处理中,终止接收线程DGRecvBCTread。然后发送广播消息,告诉其他在线应用进程,本应用进程下线,并关闭线程对象,然后调用函数DeleteName(注册的名字,Elana[0])删除注册的组名和唯一名。键入命令sendtoall后调用DGsendBCCMD(El613.2.3实例中的定向型数据报通信的算法与实现初始化与名字注册同上一小节创建接收线程GDGRecvTread和SDGRecvTread接收组播和单播消息第二个参数不同,前者为注册的组名绑定的名字号GroupNameNum,后者为注册名绑定的名字号。前者收到信息后,屏幕提示“Multicastingsender‘sname:组播发送进程注册名”和“thecontentofmessage:收到的消息内容”。在用户操作命令提示($)下,键入命令“sendtoname”回车后,程序提示应用进程的用户键入接收应用进程注册的唯一名或组名3.2.3实例中的定向型数据报通信的算法与实现初始化与名字注62屏幕提示“pleaseinputmessagetosendtothename接收进程注册的唯一名或组名:”发送进程的用户键入要发送的消息回车后,该函数调用SDGSend函数发送该消息内容。SDGSend函数在cnetbios.h中有定义,并且有5个参数:可用的LANA编号lana,接收进程注册的唯一名或组名DestName,发送进程注册名绑定的名字号NameNum,要发送消息缓冲区的指针(char*)pdata和发送缓冲区的长度len。屏幕提示“pleaseinputmessagetos633.3.1会话通信应用模型会话通信模型3.3.1会话通信应用模型会话通信模型643.3.2实例中会话服务器的算法与实现初始化与名字注册同上一节;键入session操作命令后,提示用户信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,如果键入“*”字符,则该应用进程作为服务器该进程设置消息标志pdata->flag为Listen,并用函数DatagramSendBC(Elana[0],NameNum,(char*)pdata,len)发送广播消息,通知其他在线进程,本进程作为服务器。在while循环体中,首先服务器进程调用NetbiosListen(Elana[0],pncb,LocalName)函数被动监听任何客户进程的连接请求。3.3.2实例中会话服务器的算法与实现初始化与名字注册同上一65接收一个客户进程的连接请求后,调用函数ServerSession(pncb)处理连接请求,将连接客户进程的注册名送入DestName中,然后创建会话数据接收线程SessionReceiveThread,同时指定该线程的调用参数(PVOID)pncb。屏幕显示“本地服务器进程注册名hasacceptedtheconnectionto远端客户进程注册名!”,然后休息片刻,发送数据“WelcometoServer!”

温馨提示

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

评论

0/150

提交评论