第3章基于NetBIOS的網絡編程課件_第1頁
第3章基于NetBIOS的網絡編程課件_第2頁
第3章基于NetBIOS的網絡編程課件_第3頁
第3章基于NetBIOS的網絡編程課件_第4頁
第3章基于NetBIOS的網絡編程課件_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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(發(fā)送單播和組播數據包)、sendtoall(發(fā)送廣播通信)、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支持的服務:網絡名字注冊和驗證、會話服務、無連接的數據報服務、協議和適配器的監(jiān)視與管理、支持三種軟件調用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)服務器兩個選項類型有唯一名,組名,永久節(jié)點名(網卡地址),符號名。為每個LANA編號維護一個命名表,名字(最多16個字節(jié))與一個字節(jié)的命名編號(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作為系統保留值)來識別。會話數據發(fā)送和接收都是基于所建立的虛電路,因此除了指定收發(fā)緩沖區(qū)的指針和緩沖區(qū)的長度外,還需要指定的本地會話號和LANA編號。通信結束釋放已有連接,同時釋放進程占用的內存單元,即本地會話號對應的表。會話服務呼叫功能用于建立一條與被呼叫的應用進程之間的會話連接15無連接的數據報服務NetBIOS提供單播、組播和廣播三種數據報傳送功能NetBIOS單播和組播信息發(fā)送都是基于名字,因此單播與組播的區(qū)分取決于接收方的名字是唯一名還是組名,而發(fā)送進程則需要指定本地名字編號和LANA編號。接收進程要區(qū)分單播和組播,名字編號是關鍵,如果不區(qū)分,則用通用名字號(0xff),否則唯一名編號接收為單播,組名編號接收為組播。廣播的接收和發(fā)送采用單獨的命令,不過還是以應用進程注冊名和LANA編號為基礎。無連接的數據報服務NetBIOS提供單播、組播和廣播三種數據16同步、異步和回調同步調用是一種阻塞的單向調用方式,調用方必須一直等待Netbios函數完成功能返回;異步調用是一種非阻塞的單向調用方式,Netbios函數調用后立即返回,調用雙方可以各自繼續(xù)完成自己工作,NetBIOS接口提供事件觸發(fā)以便通知調用方被調用方已經Netbios函數完成工作;回調是一種非阻塞的雙向調用方法,調用方設置Netbios函數完成工作后的程序地址,以便被調用方完成工作后執(zhí)行預先設置的那個程序。同步、異步和回調同步調用是一種阻塞的單向調用方式,調用方必須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(表示將該字節(jié)的最高位置1),而等待調用不需要;例如,pncb->ncb_command=NCBDGSEND|ASYNCH表示數據報發(fā)送命令采用非等待調用方式;異步方式通過NCB結構成員ncb_event指定事件的句柄,讓Netbios函數完成命令后觸發(fā)一個事件;回調方式是將處理程序的地址(回調函數)通過NCB結構成員ncb_post,讓Netbios函數命令完成后喚醒該程序;一般回調函數定義如下:voidCALLBACK回調函數名(PNCB);其中回調函數的參數指向的NCB就是命令執(zhí)行完成后的NCB結構。非等待調用選擇非等待調用賦值時增加|ASYNCH(表示將該字223.2.1數據報通信應用模型定向型數據報通信模型3.2.1數據報通信應用模型定向型數據報通信模型23廣播式數據報通信模型廣播式數據報通信模型243.2.2實例中的廣播式數據報通信算法與實現不論是廣播式數據報通信還是定向型數據報,都要獲取可用適配器網絡編號并完成通信的初始化。接下來是唯一名LocalName和組名GroupName的注冊,注冊成功后返回相應唯一名字號NameNum和組名字號GroupNameNum。創(chuàng)建線程DGRecvBCTread用于實現廣播數據報接收過程。定義了PdataGram結構指針,其結構的成員flag定義了Online,Offline,Listen和Message四種消息類型。3.2.2實例中的廣播式數據報通信算法與實現不論是廣播式數據25鍵入命令sendtoall后調用DGsendBCCMD(Elana[0],NameNum)函數發(fā)送廣播消息。提示進程用戶“pleaseinputmessagetobroadcast:”,鍵入發(fā)送的消息,設置消息標志flag為Message,然后調用函數DatagramSendBC(lana,NameNum,(char*)pdata,len)發(fā)送鍵入的消息內容,其中l(wèi)ana為LANA編號,NameNum為本地名字號。在退出命令exit的處理中,終止接收線程DGRecvBCTread。然后發(fā)送廣播消息,告訴其他在線應用進程,本應用進程下線,并關閉線程對象,然后調用函數DeleteName(注冊的名字,Elana[0])刪除注冊的組名和唯一名。鍵入命令sendtoall后調用DGsendBCCMD(El263.2.3實例中的定向型數據報通信的算法與實現初始化與名字注冊同上一小節(jié)創(chuàng)建接收線程GDGRecvTread和SDGRecvTread接收組播和單播消息第二個參數不同,前者為注冊的組名綁定的名字號GroupNameNum,后者為注冊名綁定的名字號。前者收到信息后,屏幕提示“Multicastingsender‘sname:組播發(fā)送進程注冊名”和“thecontentofmessage:收到的消息內容”。在用戶操作命令提示($)下,鍵入命令“sendtoname”回車后,程序提示應用進程的用戶鍵入接收應用進程注冊的唯一名或組名3.2.3實例中的定向型數據報通信的算法與實現初始化與名字注27屏幕提示“pleaseinputmessagetosendtothename接收進程注冊的唯一名或組名:”發(fā)送進程的用戶鍵入要發(fā)送的消息回車后,該函數調用SDGSend函數發(fā)送該消息內容。SDGSend函數在cnetbios.h中有定義,并且有5個參數:可用的LANA編號lana,接收進程注冊的唯一名或組名DestName,發(fā)送進程注冊名綁定的名字號NameNum,要發(fā)送消息緩沖區(qū)的指針(char*)pdata和發(fā)送緩沖區(qū)的長度len。屏幕提示“pleaseinputmessagetos283.3.1會話通信應用模型會話通信模型3.3.1會話通信應用模型會話通信模型293.3.2實例中會話服務器的算法與實現初始化與名字注冊同上一節(jié);鍵入session操作命令后,提示用戶信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,如果鍵入“*”字符,則該應用進程作為服務器該進程設置消息標志pdata->flag為Listen,并用函數DatagramSendBC(Elana[0],NameNum,(char*)pdata,len)發(fā)送廣播消息,通知其他在線進程,本進程作為服務器。在while循環(huán)體中,首先服務器進程調用NetbiosListen(Elana[0],pncb,LocalName)函數被動監(jiān)聽任何客戶進程的連接請求。3.3.2實例中會話服務器的算法與實現初始化與名字注冊同上一30接收一個客戶進程的連接請求后,調用函數ServerSession(pncb)處理連接請求,將連接客戶進程的注冊名送入DestName中,然后創(chuàng)建會話數據接收線程SessionReceiveThread,同時指定該線程的調用參數(PVOID)pncb。屏幕顯示“本地服務器進程注冊名hasacceptedtheconnectionto遠端客戶進程注冊名!”,然后休息片刻,發(fā)送數據“WelcometoServer!”給客戶進程,屏幕提示用戶“Whenyousendamessagetotheotherparty,themessage"exit"meansstoppingtosend!”,告訴用戶當鍵入消息“exit”時,停止發(fā)送。然后進入發(fā)送循環(huán)。接收一個客戶進程的連接請求后,調用函數ServerSessi31在for(;;)循環(huán)體中,提示服務器進程用戶“pleaseinputmessagetosendto客戶進程注冊名:”鍵入的消息。如果用戶鍵入“exit”,則服務器進程終止會話數據接收線程SessionReceiveThread,關閉線程句柄對象,斷開連接,然后退出循環(huán);如果不是,則調用函數SessionSend(Elana[0],SessionNum,sbuffer,sizeof(sbuffer))發(fā)送數據,發(fā)送結束后,并判斷返回retcode,如果不是成功結束,表示對方已經關閉連接,退出循環(huán)。當連接請求處理完畢后,服務器進程提示用戶“Ifyouneedlistentothenext,pleasetypetheletter"y":”,如果用戶鍵入“y”則服務器進程進入下一輪循環(huán),否則退出循環(huán),回到用戶操作命令提示狀態(tài)$等待用戶鍵入下一條命令。在for(;;)循環(huán)體中,提示服務器進程用戶“please323.3.3實例中會話客戶算法與實現初始化與名字注冊同上一節(jié);消息“Theserver服務器進程注冊名iswaitingforaclienttoconnect!”顯示告訴用戶有服務器進程等待連接。操作命令提示符$下鍵入操作命令session回車后,用戶進程提示信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,用戶鍵入服務器注冊名如果連接請求成功,則轉入客戶連接處理函數ClientSession(pncb),否則屏幕提示用戶“Theserver服務器注冊名isn'tlistening!”表示連接服務器進程失敗。3.3.3實例中會話客戶算法與實現初始化與名字注冊同上一節(jié);33像服務器處理連接函數ServerSession一樣創(chuàng)建會話數據接收線程SessionReceiveThread,同時指定該線程的調用參數(PVOID)pncb。屏幕顯示“本地客戶進程注冊名hasconnectedtotheserver遠端服務器進程注冊名!”然后屏幕提示用戶“Whenyousendamessagetotheotherparty,themessage”exit“meansstoppingtosend!”,告訴用戶當鍵入消息“exit”時,停止發(fā)送。然后進入發(fā)送循環(huán)。在for(;;)循環(huán)體中,收到服務器進程發(fā)來的消息“WelcometoServer!”,并在屏幕上顯示,并提示客戶進程用戶“pleaseinputmessagetosendto服務器進程注冊名:”用戶進入消息存放在緩沖區(qū)cbuffer內。像服務器處理連接函數ServerSession一樣創(chuàng)建會話數34如果用戶鍵入“exit”,則客戶進程終止會話數據接收線程SessionReceiveThread,關閉線程句柄對象,斷開連接,然后退出循環(huán);如果不是鍵入“exit”,則調用函數SessionSend(Elana[0],SessionNum,sbuffer,sizeof(sbuffer))發(fā)送緩沖區(qū)sbuffer的數據,發(fā)送結束后,并判斷返回retcode,如果不是成功結束,則表示對方已經關閉連接,則退出循環(huán)。發(fā)送成功結束后,提示客戶進程用戶“pleaseinputmessagetosendto服務器進程注冊名:”進入下一輪循環(huán),以便用戶鍵入消息。如果用戶鍵入“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(發(fā)送單播和組播數據包)、sendtoall(發(fā)送廣播通信)、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支持的服務:網絡名字注冊和驗證、會話服務、無連接的數據報服務、協議和適配器的監(jiān)視與管理、支持三種軟件調用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)服務器兩個選項類型有唯一名,組名,永久節(jié)點名(網卡地址),符號名。為每個LANA編號維護一個命名表,名字(最多16個字節(jié))與一個字節(jié)的命名編號(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作為系統保留值)來識別。會話數據發(fā)送和接收都是基于所建立的虛電路,因此除了指定收發(fā)緩沖區(qū)的指針和緩沖區(qū)的長度外,還需要指定的本地會話號和LANA編號。通信結束釋放已有連接,同時釋放進程占用的內存單元,即本地會話號對應的表。會話服務呼叫功能用于建立一條與被呼叫的應用進程之間的會話連接50無連接的數據報服務NetBIOS提供單播、組播和廣播三種數據報傳送功能NetBIOS單播和組播信息發(fā)送都是基于名字,因此單播與組播的區(qū)分取決于接收方的名字是唯一名還是組名,而發(fā)送進程則需要指定本地名字編號和LANA編號。接收進程要區(qū)分單播和組播,名字編號是關鍵,如果不區(qū)分,則用通用名字號(0xff),否則唯一名編號接收為單播,組名編號接收為組播。廣播的接收和發(fā)送采用單獨的命令,不過還是以應用進程注冊名和LANA編號為基礎。無連接的數據報服務NetBIOS提供單播、組播和廣播三種數據51同步、異步和回調同步調用是一種阻塞的單向調用方式,調用方必須一直等待Netbios函數完成功能返回;異步調用是一種非阻塞的單向調用方式,Netbios函數調用后立即返回,調用雙方可以各自繼續(xù)完成自己工作,NetBIOS接口提供事件觸發(fā)以便通知調用方被調用方已經Netbios函數完成工作;回調是一種非阻塞的雙向調用方法,調用方設置Netbios函數完成工作后的程序地址,以便被調用方完成工作后執(zhí)行預先設置的那個程序。同步、異步和回調同步調用是一種阻塞的單向調用方式,調用方必須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(表示將該字節(jié)的最高位置1),而等待調用不需要;例如,pncb->ncb_command=NCBDGSEND|ASYNCH表示數據報發(fā)送命令采用非等待調用方式;異步方式通過NCB結構成員ncb_event指定事件的句柄,讓Netbios函數完成命令后觸發(fā)一個事件;回調方式是將處理程序的地址(回調函數)通過NCB結構成員ncb_post,讓Netbios函數命令完成后喚醒該程序;一般回調函數定義如下:voidCALLBACK回調函數名(PNCB);其中回調函數的參數指向的NCB就是命令執(zhí)行完成后的NCB結構。非等待調用選擇非等待調用賦值時增加|ASYNCH(表示將該字573.2.1數據報通信應用模型定向型數據報通信模型3.2.1數據報通信應用模型定向型數據報通信模型58廣播式數據報通信模型廣播式數據報通信模型593.2.2實例中的廣播式數據報通信算法與實現不論是廣播式數據報通信還是定向型數據報,都要獲取可用適配器網絡編號并完成通信的初始化。接下來是唯一名LocalName和組名GroupName的注冊,注冊成功后返回相應唯一名字號NameNum和組名字號GroupNameNum。創(chuàng)建線程DGRecvBCTread用于實現廣播數據報接收過程。定義了PdataGram結構指針,其結構的成員flag定義了Online,Offline,Listen和Message四種消息類型。3.2.2實例中的廣播式數據報通信算法與實現不論是廣播式數據60鍵入命令sendtoall后調用DGsendBCCMD(Elana[0],NameNum)函數發(fā)送廣播消息。提示進程用戶“pleaseinputmessagetobroadcast:”,鍵入發(fā)送的消息,設置消息標志flag為Message,然后調用函數DatagramSendBC(lana,NameNum,(char*)pdata,len)發(fā)送鍵入的消息內容,其中l(wèi)ana為LANA編號,NameNum為本地名字號。在退出命令exit的處理中,終止接收線程DGRecvBCTread。然后發(fā)送廣播消息,告訴其他在線應用進程,本應用進程下線,并關閉線程對象,然后調用函數DeleteName(注冊的名字,Elana[0])刪除注冊的組名和唯一名。鍵入命令sendtoall后調用DGsendBCCMD(El613.2.3實例中的定向型數據報通信的算法與實現初始化與名字注冊同上一小節(jié)創(chuàng)建接收線程GDGRecvTread和SDGRecvTread接收組播和單播消息第二個參數不同,前者為注冊的組名綁定的名字號GroupNameNum,后者為注冊名綁定的名字號。前者收到信息后,屏幕提示“Multicastingsender‘sname:組播發(fā)送進程注冊名”和“thecontentofmessage:收到的消息內容”。在用戶操作命令提示($)下,鍵入命令“sendtoname”回車后,程序提示應用進程的用戶鍵入接收應用進程注冊的唯一名或組名3.2.3實例中的定向型數據報通信的算法與實現初始化與名字注62屏幕提示“pleaseinputmessagetosendtothename接收進程注冊的唯一名或組名:”發(fā)送進程的用戶鍵入要發(fā)送的消息回車后,該函數調用SDGSend函數發(fā)送該消息內容。SDGSend函數在cnetbios.h中有定義,并且有5個參數:可用的LANA編號lana,接收進程注冊的唯一名或組名DestName,發(fā)送進程注冊名綁定的名字號NameNum,要發(fā)送消息緩沖區(qū)的指針(char*)pdata和發(fā)送緩沖區(qū)的長度len。屏幕提示“pleaseinputmessagetos633.3.1會話通信應用模型會話通信模型3.3.1會話通信應用模型會話通信模型643.3.2實例中會話服務器的算法與實現初始化與名字注冊同上一節(jié);鍵入session操作命令后,提示用戶信息“Enterthecharacter*(tolistenasaserver)ortheserver‘sname(toconnectasaclient):”,如果鍵入“*”字符,則該應用進程作為服務器該進程設置消息標志pdata->flag為Listen,并用函數DatagramSendBC(Elana[0],NameNum,(char*)pdata,len)發(fā)送廣播消息,通知其他在線進程,本進程作為服務器。在while循環(huán)體中,首先服務器進程調用NetbiosListen(Elana[0],pncb,LocalName)函數被動監(jiān)聽任何客戶進程的連接請求。3.3.2實例中會話服務器的算法與實現初始化與名字注冊同上一65接收一個客戶進程的連接請求后,調用函數ServerSession(pncb)處理連接請求,將連接客戶進程的注冊名送入DestName中,然后創(chuàng)建會話數據接收線程SessionReceiveThread,同時指定該線程的調用參數(PVOID)pncb。屏幕顯示“本地服務器進程注冊名hasacceptedtheconnectionto遠端客戶進程注冊名!”,然后休息片刻,發(fā)送數據“WelcometoServer!”

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論