版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第2章基于NetBIOS的網(wǎng)絡(luò)編程網(wǎng)絡(luò)基本輸入/輸出系統(tǒng)(NetBIOS)是一個(gè)傳統(tǒng)的應(yīng)用程序接口(API),用于數(shù)據(jù)源和目的地之間的數(shù)據(jù)交換。NetBIOS同時(shí)兼容于較老的操作系統(tǒng),如OS/2和DOS等。NetBIOS為程序提供了請(qǐng)求低級(jí)網(wǎng)絡(luò)服務(wù)的統(tǒng)一命令集,從而實(shí)現(xiàn)了給局域網(wǎng)(LAN)提供網(wǎng)絡(luò)以及其他特殊功能的目的。目前NetBIOS改進(jìn)版(NetBEUI)與TCP/IP以及IPX/SPX合稱為LAN通信三大協(xié)議。此外,幾乎所有的LAN都是在NetBIOS協(xié)議基礎(chǔ)上工作的。第2章基基于NetBIOS的網(wǎng)絡(luò)絡(luò)編程2.1NetBIOS的基本概概念2.2NetBIOS命令2.3數(shù)數(shù)據(jù)據(jù)報(bào)通信信程序設(shè)設(shè)計(jì)2.4會(huì)會(huì)話話通信程程序設(shè)計(jì)計(jì)2.1..1NetBIOS概述述NetBIOS是一種標(biāo)標(biāo)準(zhǔn)的應(yīng)應(yīng)用程序序編程接接口(API)),1983年由Sytex公司專為為IBM開發(fā)成功功,它為為網(wǎng)絡(luò)通通信定義義了一種種編程接接口。1985年,IBM創(chuàng)建了NetBIOS擴(kuò)展用戶戶接口NetBEUI,它同NetBIOS接口集成成在一起起,構(gòu)成成了一套套完整的的協(xié)議。。后來由由于NetBIOS接口愈來來愈流行行,所以以各大廠廠商也開開始在其其他(如如TCP//IP))協(xié)議上實(shí)實(shí)施NetBIOS程序接口口。NetBIOS特性1、NetBIOSAPI接口適用用于為數(shù)數(shù)眾多的的網(wǎng)絡(luò)協(xié)協(xié)議,使使得程序序接口““與協(xié)議議無關(guān)””。2、NetBIOS協(xié)議短小小精練,,與TCP//IP和IPX//SPX相比具有有極高的的網(wǎng)絡(luò)通通信性能能,非常常適用于于實(shí)時(shí)性性要求較較高的小小型LAN網(wǎng)絡(luò)環(huán)境境3、NetBIOS同時(shí)提供供了“面面向連接接”與““非面向向連接((無連接接)”服服務(wù)NetBIOS特性4、利用用NetBIOS接口編程程必須注注意以下下三個(gè)問問題:①為保保證兩個(gè)個(gè)NetBIOS應(yīng)用程序序通過網(wǎng)網(wǎng)絡(luò)進(jìn)行行正常通通信,那那么對(duì)它它們各自自執(zhí)行的的計(jì)算機(jī)機(jī)來說,,至少必必須安裝裝一種兩兩者通用用的協(xié)議議②MicrosoftTCP/IP和NetBEUI在默認(rèn)的的情況下下已提供供了NetBIOS接口,但但是IPX//SPX卻并非如如此;③與TCP//IP和IPX//SPX不同,NetBEUI不是一種種“可路路由”協(xié)協(xié)議,因因此要想想在兩個(gè)個(gè)不同子子網(wǎng)中保保證兩個(gè)個(gè)NetBIOS應(yīng)用程序序正常通通信,那那么在配配置網(wǎng)絡(luò)絡(luò)時(shí),至至少應(yīng)安安裝一種種可路由由的傳送送協(xié)議。。NetBIOS在Windows中中的應(yīng)用用Windows的客戶機(jī)機(jī)/服務(wù)務(wù)器(C/S))網(wǎng)絡(luò)系統(tǒng)統(tǒng)就是基基于NetBIOS的網(wǎng)絡(luò);;WindowsNT操作系統(tǒng)統(tǒng)中的大大量的內(nèi)內(nèi)部聯(lián)網(wǎng)網(wǎng)工作也也都是利利用NetBIOS來完成的的。微軟還為為許多協(xié)協(xié)議提供供了標(biāo)準(zhǔn)準(zhǔn)NetBIOS界面,如如TCP//IP、、NetBEUI和NWLink,,使NetBIOS的應(yīng)用更更加趨于于方便網(wǎng)絡(luò)應(yīng)用用舉例::瀏覽網(wǎng)網(wǎng)上鄰居居、共享享文件Windows2000//XP中的NetBIOS的設(shè)置DHCP是DynamicHostConfigurationProtocol的縮寫寫,它是是TCP/IP協(xié)議簇簇中的一一種,主主要是用用來給網(wǎng)網(wǎng)絡(luò)客戶戶機(jī)分配配動(dòng)態(tài)的的IP地地址。這這些被分分配的IP地址址都是DHCP服務(wù)器器預(yù)先保保留的一一個(gè)由多多個(gè)地址址組成的的地址集集,并且且它們一一般是一一段連續(xù)續(xù)的地址址。在TCP/IP上使用用NetBIOS需要要LMHOSTS與WINS服務(wù)器器來注冊(cè)NetBIOS名字。。Windows2000//XP中的NetBEUI的設(shè)置2.1..2LANA編號(hào)號(hào)問題:傳傳送協(xié)議議與NetBIOS如何對(duì)應(yīng)應(yīng)起來呢呢?LANA編號(hào)———LAN適配器編編號(hào)定義:每每個(gè)LANA編號(hào)對(duì)應(yīng)應(yīng)于網(wǎng)卡卡及傳輸輸協(xié)議的的唯一組組合。舉例:假假定某工工作站安安裝了兩兩塊網(wǎng)卡卡,以及及兩種具具有NetBIOS能力地傳傳輸協(xié)議議:TCP//IP和NetBEUI,那么總共共就有4個(gè)LANA編號(hào)。LANA編號(hào)下面是它它們之間間的一種種對(duì)應(yīng)關(guān)關(guān)系:0NetBEUI—網(wǎng)卡11TCP//IP——網(wǎng)卡12NetBEUI—網(wǎng)卡23TCP//IP——網(wǎng)卡2通常,LANA編號(hào)的范范圍在0~9之之間,除除LANA0之外,其其它編號(hào)號(hào)由操作作系統(tǒng)自自行分配配,LANA0表示的是是“默認(rèn)認(rèn)”LANA若某工作站裝有兩塊網(wǎng)卡以及三種具有NetBIOS能力的傳輸協(xié)議(如TCP/IP、NetBEUI和IPX/SPX),那么它有多少個(gè)LANA編號(hào)?2.1..3NetBIOS名字字NetBIOS是一種按名字工工作的系統(tǒng),,NetBIOS保留一張張名字表表,每個(gè)個(gè)名字都都是16字節(jié)長長。NetBIOS名字有兩兩種類型型:唯一名:某個(gè)節(jié)節(jié)點(diǎn)的應(yīng)應(yīng)用進(jìn)程程在網(wǎng)絡(luò)絡(luò)中注冊(cè)冊(cè)的獨(dú)一一無二的的名字。。組名:多個(gè)節(jié)節(jié)點(diǎn)可擁擁有同一一組名。。主要用用于多點(diǎn)點(diǎn)發(fā)送的的數(shù)據(jù)通通信,NetBIOS名字注意:1、為一一個(gè)節(jié)點(diǎn)點(diǎn)指定名名字時(shí),,注意不不要用““*”號(hào)號(hào)或二進(jìn)進(jìn)制“0”開頭頭,也不不要用““IBM””這3個(gè)字字母開頭頭。2、對(duì)每每個(gè)LANA來說,能能夠添加加的名字字的最大大數(shù)量是是254,名字字號(hào)從1到254(0和255由系系統(tǒng)保留留)2.1..4NetBIOS接口口函數(shù)NetBIOSAPI函數(shù):UCHARNetbios(PNCBpncb)(1)該函數(shù)只只有一個(gè)個(gè)參數(shù)pncb,它對(duì)應(yīng)于于指向某某個(gè)網(wǎng)絡(luò)絡(luò)控制塊塊NCB的一個(gè)指指針,在在NCB結(jié)構(gòu)中,,包含了了為執(zhí)行行一個(gè)Netbios命令相對(duì)對(duì)應(yīng)的Netbios函數(shù)需要要用到的的全部信信息。結(jié)結(jié)構(gòu)定義義見書上上P14--P15:typedefstruct_NCB{UCHARncb__command;//指定要執(zhí)執(zhí)行的Netbios命令UCHARncb__retcode;//指定操作作的返回回值UCHARncb__lsn;//對(duì)應(yīng)一個(gè)個(gè)本地交交互編號(hào),成功功執(zhí)行NCBCALL或NCBLISTEN命令后,,函數(shù)會(huì)會(huì)返回一一個(gè)新的的交互編編號(hào)UCHARncb__num;//指定本地地名字的的編號(hào),,NCBADDNAME或NCBADDGRNAME命令的每一一次使用用,都會(huì)會(huì)返回一一個(gè)新的的編號(hào)PUCHARncb__buffer;//指向數(shù)據(jù)據(jù)緩沖區(qū)區(qū)WORDncb__length;//指定緩沖沖區(qū)的長長度UCHARncb__callname[[NCBNAMSZ];//指定遠(yuǎn)程應(yīng)用用程序名名字
UCHARncb__name[NCBNAMSZ];//指定應(yīng)用用程序已知的的名字UCHARncb__rto;//設(shè)置接收收操作的的超時(shí)期期限UCHARncb__sto;//設(shè)置發(fā)送送操作的的超時(shí)期期限void(CALLBACK*ncb__post)(struct_NCB*));//指定異步步命令完完成后需需要使用的的post例程的地地址UCHARncb__lana_num;//指定要在在上面執(zhí)執(zhí)行命令的LANA編號(hào)UCHARncb__cmd_cplt;//指定操作作代碼的的返回值UCHARncb_reserve[[10]];//保留,必必須為0HANDLEncb__event;//指定設(shè)置置Nonsignaled狀態(tài)的一一個(gè)windows事件對(duì)象象的句柄柄}NCB,*PNCB;并不是在在對(duì)NetBIOS的每次調(diào)調(diào)用中都都需要用用到Ncb結(jié)構(gòu)內(nèi)的的全部成成員,在在調(diào)用一一個(gè)NetBIOS命令時(shí)并并不一定定要填寫寫每一個(gè)個(gè)NCB域;此外外,NCB中的一些些域具有有輸出參參數(shù)的功功能,命命令執(zhí)行行后的返返回值將將填充到到這些域域中。還應(yīng)當(dāng)注注意的是是,在填填寫NCB結(jié)構(gòu)成員員之前,,必須對(duì)對(duì)這個(gè)NCB結(jié)構(gòu)清零零,消除除殘留參參數(shù)的影影響,然然后再開開始填寫寫結(jié)構(gòu)內(nèi)內(nèi)的相應(yīng)應(yīng)成員。。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接口函函數(shù)(2)使使用函數(shù)數(shù)Netbios必須注意意:①程程序的頭頭文件中中必須包包含“nb30.h””:#include<<nb30.h>②程序在鏈鏈接時(shí)加加入“netapi32.lib””:#pragmacomment(lib,““netapi32..lib”)2.2NetBIOS命令NetBIOS的所有功功能都是是通過執(zhí)執(zhí)行一系系列的命命令來完完成的,,共26條命令令。(1)NetBIOS命令中大大多命令令都有同同步(等等待)或或異步((非等待待)兩種種狀態(tài),,所有命命令默認(rèn)認(rèn)為同步步:同步狀態(tài)態(tài):命令令原型異步狀態(tài)態(tài):命令令原型|ASYNCH同步方式式和異步步方式的的比較::采用同步步方式時(shí)時(shí),NetBIOS要等到該該命令完完成之后后才能返返回到你你的程序序。采用異步步方式時(shí)時(shí),將后后續(xù)處理理程序的的地址或或一個(gè)事事件句柄柄告訴給給NetBIOS,然后NetBIOS立即返回回到當(dāng)前前程序,,當(dāng)該命命令執(zhí)行行完成時(shí)時(shí)將自動(dòng)動(dòng)喚醒處處理程序序或觸發(fā)發(fā)相應(yīng)的的事件。。為了提高高程序的的執(zhí)行效效率,通通常采用用異步方方式,只只有少數(shù)數(shù)幾個(gè)NetBIOS命令必須須采用同同步方式式,如NetBIOS復(fù)位命令令。(2)26條命命令分類類:①控制制和測試試命令((5條)):控制命令令(3條條):NCBRESET、NCBCANCEL、、NCBUNLINK;測試命令令(2條條):NCBSSTAT、NCBASTAT②名字管理理命令((3條)):NCBADDNAME、NCBADDGRNAME、NCBDELNAME③數(shù)據(jù)報(bào)通通信命令令(4條條):NCBDGSEND((或NCBDGSEND||ASYNCH)NCBDGRECV((或NCBDGRECV||ASYNCH)NCBDGSENDBC(或NCBDGSENDBC|ASYNCH))NCBDGRECVBC(或NCBDGRECVBC|ASYNCH))④會(huì)話通信信命令((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的初始化化程序主主要包括括兩個(gè)函函數(shù):EnumLana()):獲得當(dāng)前前所有可可用的網(wǎng)網(wǎng)卡編號(hào)號(hào)(0~~254)ResetNcb()):復(fù)位指定定網(wǎng)卡上上的NetBIOS接口,并并重設(shè)相相關(guān)的環(huán)環(huán)境參數(shù)數(shù)ResetNcb())必須在所所有NetBIOS應(yīng)用中首首先被執(zhí)執(zhí)行,只只有初始始化成功功,才能能進(jìn)行后后面的工工作。LanaEnum())NCB輸入:ncb__command=NCBENUMncb__buffer:分配一個(gè)個(gè)LANA_ENUM結(jié)構(gòu)ncb__length:設(shè)為LANA_ENUM結(jié)構(gòu)的長長度NCB輸出:ncb__cmd_cplt:命令的最最終返回回碼,成成功為NRC__GOODRET若命令成成功執(zhí)行行,則會(huì)會(huì)填充指指定的LANA_ENUM結(jié)構(gòu),其其結(jié)構(gòu)定定義如下下:TypedefstructLANA_ENUM{UCHARlength;//指出本地地計(jì)算機(jī)機(jī)共有多多少個(gè)LANA編號(hào)UCHARlana[MAX_LANA];//由實(shí)際的的LANA編號(hào)構(gòu)成成的一個(gè)個(gè)數(shù)組,}而length值指出lana數(shù)組內(nèi)有有多少個(gè)個(gè)元素會(huì)會(huì)被填充充LANA編號(hào)。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]::可同時(shí)進(jìn)進(jìn)行的最最大會(huì)話話數(shù)(0為缺省省)ncb__callname[[2]::可增加的的最大NetBIOS名字?jǐn)?shù)((0為缺缺?。﹏cb__callname[[3]::是否允許許主機(jī)名名作為自自己的NetBIOS名字ncb__lana_num:指定要執(zhí)執(zhí)行復(fù)位位的LANA編號(hào)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()函數(shù)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編號(hào)有%d\n",lenum.lana[i]]);if(RestNCB(lenum.lana[[i]))!=NRC__GOODRET)printf(("ResetNcbError!"));elseprintf(""ResetNcbOk!!");;continue;}}}}}}運(yùn)行結(jié)果果:2.3..2加加名字字與刪除除名字NetBIOS是基于名名字通信信的系統(tǒng)統(tǒng),通常常情況下下,都應(yīng)應(yīng)該為應(yīng)應(yīng)用進(jìn)程程加入若若干名字字(唯一一名或組組名),,以適應(yīng)應(yīng)不同通通信進(jìn)程程的需要要,在一一個(gè)通信信進(jìn)程結(jié)結(jié)束時(shí),,還應(yīng)該該刪除不不再使用用的名字字,以便便釋放相相應(yīng)的系系統(tǒng)資源源。加名字與與刪除名名字函數(shù)數(shù)主要函數(shù)數(shù)有:AddName()::在本地名名字表中中添加一一個(gè)唯一一名字,,并返回回一個(gè)名名字號(hào)AddGroupName(():在本地名名字表中中添加一一個(gè)組名名,并返返回一個(gè)個(gè)名字號(hào)號(hào)DeleteName()::在本地名名字表中中刪除一一個(gè)唯一一名或組組名AddName()AddName():AddGroupName(()、DeleteName()與AddName()類似NCB輸入:ncb__command=NCBADDNAMEncb__name:要添加的的16字字節(jié)的名名字字符符串ncb__lana_num:指定要執(zhí)執(zhí)行命令令的LANA編號(hào)NCB輸出:ncb__num:返回新注注冊(cè)名字字的編號(hào)號(hào)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);;}加名字與與刪除名名字程序序示例加名字與與刪除名名字程序序示例((續(xù))2.3數(shù)數(shù)據(jù)據(jù)報(bào)通信信程序設(shè)設(shè)計(jì)數(shù)據(jù)報(bào)((Datagram)是一種““非面向向連接””的通信信方式。。作為發(fā)發(fā)送方,,只需指指定接收收方的NetBIOS名字作為為目標(biāo)地地址便可可實(shí)現(xiàn)數(shù)數(shù)據(jù)報(bào)發(fā)發(fā)送,此此時(shí),NetBIOS不會(huì)執(zhí)行行任何檢檢查,不不能確保保數(shù)據(jù)的的完整性性、抵達(dá)達(dá)順序或或者傳輸輸?shù)目煽靠啃缘鹊鹊?。?shù)據(jù)報(bào)發(fā)發(fā)送共有有三種方方式:將數(shù)據(jù)報(bào)報(bào)發(fā)送到到一個(gè)特特定的唯唯一名,,則只有有注冊(cè)了了該名字字的那個(gè)個(gè)進(jìn)程才才有權(quán)接接收將數(shù)據(jù)報(bào)報(bào)發(fā)給一一個(gè)組名名,則只只有注冊(cè)冊(cè)了該組組名的那那些進(jìn)程程才有權(quán)權(quán)接收將數(shù)據(jù)報(bào)報(bào)廣播到到整個(gè)網(wǎng)網(wǎng)絡(luò),局局域網(wǎng)內(nèi)內(nèi)任何一一個(gè)工作作站上的的任何進(jìn)進(jìn)程都有有權(quán)接收收這個(gè)數(shù)數(shù)據(jù)報(bào)消消息數(shù)據(jù)報(bào)的的接收對(duì)對(duì)應(yīng)也有有三種方方式。前兩種要要用特定定的本地地名字來來接收,,若有指指定發(fā)送送方名字字,則只只接收這這個(gè)名字字發(fā)來的的數(shù)據(jù),,反之則則無論誰誰發(fā)來的的數(shù)據(jù)都都接收。。對(duì)于第三三種,不不用指定定任何本本地名字字號(hào)。基于NetBIOS的數(shù)據(jù)報(bào)報(bào)通信的的基本模模型客戶機(jī)A客戶機(jī)BResetNcb()AddName()Send()DeleteName()ResetNcb()AddName()Recv()DeleteName()發(fā)送數(shù)據(jù)報(bào)到客戶機(jī)BRecv()Send()發(fā)送數(shù)據(jù)報(bào)到客戶機(jī)A2.3..1點(diǎn)點(diǎn)對(duì)點(diǎn)點(diǎn)數(shù)據(jù)報(bào)報(bào)通信程程序點(diǎn)對(duì)點(diǎn)通通信是數(shù)數(shù)據(jù)報(bào)通通信程序序的一種種簡單應(yīng)應(yīng)用。發(fā)發(fā)送方使使用NCBDGSEND命令發(fā)送送數(shù)據(jù)報(bào)報(bào),接收收方使用用NCBDGRECV命令接收收數(shù)據(jù)。。通常情況況下,數(shù)數(shù)據(jù)報(bào)發(fā)發(fā)送采用用同步((等待))方式,,而數(shù)據(jù)據(jù)報(bào)接收收則采用用異步((非等待待)方式式,發(fā)送送和接收收的數(shù)據(jù)據(jù)報(bào)最大大長度為為512字節(jié),,多余部部分將會(huì)會(huì)被丟棄棄。數(shù)據(jù)報(bào)發(fā)發(fā)送函數(shù)數(shù)DatagramSend(()NCB輸入:ncb__command=NCBDGSENDncb__num:本地名字字號(hào)(發(fā)發(fā)送方為為自己注注冊(cè)的名名字編號(hào)號(hào))ncb__callname:接收方的的NetBIOS名字ncb__buffer:指向發(fā)送送緩沖區(qū)區(qū)的指針針ncb__length:發(fā)送緩沖沖區(qū)的長長度(1~512字節(jié)節(jié))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));}數(shù)據(jù)報(bào)接接收函數(shù)數(shù)DatagramRecv()NCB輸入:ncb__command=NCBDGRECV|ASYNCHncb__num:本地名字字號(hào)(接接收方為為自己注注冊(cè)的名名字編號(hào)號(hào))ncb__callname:發(fā)送方的的NetBIOS名字ncb__buffer:指向接收收緩沖區(qū)區(qū)的指針針ncb__length:接收緩沖沖區(qū)的長長度(1~512字節(jié)節(jié))ncb__event:指定異步步命令完完成后需需觸發(fā)的的事件句句柄,同同步命令令為“空空”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)創(chuàng)建事事件HANDLECreateEvent((LPSECURITY_ATTRIBUTESlpEvent,,//安全屬性性BOOLbManuaReset,///是否人工工重置BOOLbInitialState,///初始是否否有信號(hào)號(hào)狀態(tài)LPCTSTRlpName///名字)DWORDWaitForSingleObject((HANDLEhHandle,,DWORDdwMilliseconds)hHandle:同步對(duì)象象句柄dwMilliseconds:以毫秒為為單位的的超時(shí)間間隔hEvent==CreateEvent((NULL,FALSE,FALSE,NULL);if(hEvent===NULL))return;;….DatagramRecv((&RecvNcb,,(UCHAR*))RemoteName,LocalNameNum,,hEvent,buff));WaitForSingleObject(hEvent,0xffffffff);簡單數(shù)據(jù)據(jù)報(bào)通信信程序示示例發(fā)送方““abc””不斷給接接收方““xyz””發(fā)送數(shù)據(jù)據(jù)(數(shù)據(jù)據(jù)內(nèi)容由由用戶指指定),,雙方直直到收到到一條““exit”消息后停停止通信信。數(shù)據(jù)報(bào)發(fā)發(fā)送程序序數(shù)據(jù)報(bào)接接收程序序程序說明明1、發(fā)送送方程序序采用循循環(huán)發(fā)送送結(jié)構(gòu),,接收方方程序采采用循環(huán)環(huán)接收結(jié)結(jié)構(gòu)。當(dāng)當(dāng)發(fā)送方方從鍵盤盤上鍵入入一個(gè)字字符串后后,發(fā)送送程序?qū)⒃撟址鳛闉閿?shù)據(jù)報(bào)報(bào)直接發(fā)發(fā)送給接接收方,,接收方方在收到到一個(gè)數(shù)數(shù)據(jù)報(bào)后后,將收收到的字字符串顯顯示在屏屏幕上,,如果發(fā)發(fā)送方鍵鍵入的是是“exit”,則通信雙雙方結(jié)束束通信,,程序退退出。2、接收收方程序序用到了了兩個(gè)WindowsAPI函數(shù):創(chuàng)創(chuàng)建事件件函數(shù)CreateEvent())和等待事事件函數(shù)數(shù)WaitForSingleObject(),,利用這兩兩個(gè)函數(shù)數(shù)的目的的是用來來配合處處理異步步接收命命令。2.3..2組組播與與廣播通通信程序序組播通信信程序設(shè)設(shè)計(jì):組播通信信與點(diǎn)對(duì)對(duì)點(diǎn)通信信程序的的結(jié)構(gòu)類類似,所所用的發(fā)發(fā)送和接接收命令令也相同同,只是是發(fā)送方方在指定定接受方方的名字字時(shí)應(yīng)設(shè)設(shè)置為特特定的遠(yuǎn)遠(yuǎn)程組名名,而多多個(gè)接收收方均應(yīng)應(yīng)使用相相同的組組名來設(shè)設(shè)置接收收。這樣樣,只要要發(fā)送方方發(fā)送一一個(gè)特定定的組播播數(shù)據(jù)報(bào)報(bào),那些些以特定定組名等等待接收收的進(jìn)程程均能同同時(shí)接收收到這個(gè)個(gè)組播數(shù)數(shù)據(jù)報(bào)。。課堂練習(xí)習(xí)作業(yè)1:擬寫程程序?qū)崿F(xiàn)現(xiàn)組播通通信。發(fā)送方接接收工作作組ResetNcb())AddName()Send()DeleteName()ResetNcb())AddGRName(()Recv()DeleteName()發(fā)送數(shù)據(jù)據(jù)報(bào)到工工作組作業(yè)一P56頁頁2.32..42.52.62.10廣播通信信程序設(shè)設(shè)計(jì):廣播通信信與組播播通信略略有不同同,主要要差別在在于:1.廣廣播發(fā)送送與接收收應(yīng)采用用特定的的廣播命命令,廣廣播發(fā)送送用NCBDGSENDBC命令,而而廣播接接收用NCBDGRECVBC命令2.由由于所有有工作站站均接收收廣播消消息,因因此發(fā)送送方在發(fā)發(fā)送廣播播數(shù)據(jù)報(bào)報(bào)時(shí)無需需指定ncb__callname的值。利用廣播播通信實(shí)實(shí)現(xiàn)時(shí)間間同步程程序示例例假設(shè)有一一個(gè)標(biāo)準(zhǔn)準(zhǔn)時(shí)間服服務(wù)器,,當(dāng)網(wǎng)內(nèi)內(nèi)一個(gè)工工作站發(fā)發(fā)出“對(duì)對(duì)時(shí)”請(qǐng)請(qǐng)求數(shù)據(jù)據(jù)報(bào)后,,標(biāo)準(zhǔn)時(shí)時(shí)間服務(wù)務(wù)器便以以廣播方方式發(fā)送送一個(gè)標(biāo)標(biāo)準(zhǔn)時(shí)間間,以同同步局域域網(wǎng)內(nèi)所所有工作作站的基基準(zhǔn)時(shí)間間。時(shí)間服務(wù)務(wù)器工作站ResetNcb())AddName()SendBaseTime(()DeleteName()ResetNcb())AddName()RecvBaseTime(()DeleteName()請(qǐng)求基準(zhǔn)準(zhǔn)時(shí)間WaitTimeRequest(()發(fā)送基準(zhǔn)準(zhǔn)時(shí)間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));}補(bǔ)充:NCBASTAT命令測試網(wǎng)絡(luò)絡(luò)中任一一個(gè)目前前正在工工作的工工作站的的網(wǎng)絡(luò)適適配器狀狀態(tài)。NCB輸入:ncb__command=NCBASTATncb__callname:工作站名名字ncb__lana_num:指定要執(zhí)執(zhí)行命令令的LANA編號(hào)ncb__buffer:狀態(tài)緩沖沖區(qū)指針針ncb__length:狀態(tài)緩沖沖區(qū)長度度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會(huì)會(huì)話話通信程程序設(shè)計(jì)計(jì)會(huì)話是一一種面向向連接的的可靠通通信方式式。與數(shù)數(shù)據(jù)報(bào)相相比,會(huì)會(huì)話通信信可以保保證數(shù)據(jù)據(jù)的完整整性、抵抵達(dá)順序序及傳輸輸?shù)目煽靠啃?。一一般分成成三個(gè)階階段:建立連接接數(shù)據(jù)傳輸輸斷開連接接基于NetBIOS的會(huì)話通通信模型型服務(wù)器客戶機(jī)ResetNcb()AddName()Listen()HangUp()ResetNcb()AddName()Call()HangUp()建立會(huì)話連接Send/Recv()Recv/Send會(huì)話通信DeleteName()DeleteName()關(guān)閉會(huì)話NetBIOS的會(huì)話話通信步步驟①初始化。。通信雙雙方分別別執(zhí)行NCBRESET命令,復(fù)復(fù)位各自自的NetBIOS。②添加名字字。為了了建立會(huì)會(huì)話,通通信雙方方應(yīng)分別別執(zhí)行NCBADDNAME命令,在在各自的的本地名名字表中中添加唯唯一名。。NetBIOS的會(huì)話話通信步步驟③建立會(huì)話話。在進(jìn)進(jìn)行會(huì)話話通信之之前,必必須首先先建立一一個(gè)會(huì)話話連接。。該過程程需由服服務(wù)器和和客戶機(jī)機(jī)協(xié)同完完成,服服務(wù)器方方使用NCBLISTEN命令等待待客戶機(jī)機(jī)的連接接請(qǐng)求,,客戶方方使用NCBCALL命令向服服務(wù)器發(fā)發(fā)起會(huì)話話連接請(qǐng)請(qǐng)求。一一旦會(huì)話話建立成成功,在在雙方的的NetBIOS接口上便便會(huì)建立立一個(gè)會(huì)會(huì)話,并并分別為為會(huì)話雙雙方賦予予唯一的的會(huì)話號(hào)號(hào),以后后通信雙雙方就可可以利用用該會(huì)話話號(hào)進(jìn)行行會(huì)話通通信。NetBIOS的會(huì)話話通信步步驟④數(shù)據(jù)傳輸輸。會(huì)話話建立后后,雙方方便可利利用NCBSEND和NCBRECV等會(huì)話命命令進(jìn)行行會(huì)話通通信。⑤拆除會(huì)話話。當(dāng)數(shù)數(shù)據(jù)傳輸輸結(jié)束后后,任何何一方均均可發(fā)出出NCBHANGUP命令來拆拆除指定定會(huì)話號(hào)號(hào)上的會(huì)會(huì)話連接接,以及及時(shí)釋放放系統(tǒng)資資源。⑥刪除名字字。在會(huì)會(huì)話通信信進(jìn)行結(jié)結(jié)束后,,雙方還還應(yīng)刪除除各自本本地名字字表中的的名字。。會(huì)話通信信命令NetBIOS的會(huì)話通通信命令令共有9條,每每條命令令都有等等待和非非等待兩兩種方式式,通常常情況下下發(fā)送方方采用等等待方式式,而接接收方則則采用非非等待方方式。(1)發(fā)發(fā)起連接接請(qǐng)求Call命令命令代碼碼:NCBCALL,NCBCALL||ASYNCH命令功能能:請(qǐng)求求與某個(gè)個(gè)遠(yuǎn)程工工作站建建立一個(gè)個(gè)會(huì)話NCB輸入:ncb__command=NCBCALL或NCBCALL|ASYNCHncb__name:本地名字字ncb__callname:遠(yuǎn)程名字字ncb__rto:接收時(shí)限限(以0.5s為單位))ncb__sto:發(fā)送時(shí)限限(以0.5s為單位))ncb__event:指定異步步命令完完成后需需觸發(fā)的的事件句句柄,同同步命令令時(shí)為““空”NCB輸出:ncb__lsn:分配的本本地會(huì)話話號(hào)ncb__cmd_cplt::命令的最最終返回回碼注意:1、要在在兩個(gè)名名字之間間真正建建立會(huì)話話,對(duì)方方必須已已經(jīng)發(fā)出出Listen命令才行行。如果果Call命令成功功,NetBIOS即返回一一個(gè)本地地會(huì)話號(hào)號(hào)LSN,,供后面的的會(huì)話通通信命令令引用。。如果Call命令呼叫叫的對(duì)方方?jīng)]有發(fā)發(fā)出Listen命令,那那么Call命令會(huì)反反復(fù)試幾幾次,最最后返回回出錯(cuò)信信息。2、在會(huì)會(huì)話過程程中發(fā)送送超時(shí)和和接收超超時(shí)的時(shí)時(shí)限應(yīng)在在Call命令中指指定,而而不是在在后面的的發(fā)送//接收命命令中指指定的。。ncb__sto(發(fā)送時(shí)限限)和ncb__rto(接收時(shí)限限)兩個(gè)個(gè)字段的的值是以以0.5s為單位的的,若設(shè)設(shè)為“0”表示示沒有超超時(shí)機(jī)制制,即可可以無限限期等待待,這一一點(diǎn)在使使用時(shí)要要非常小小心。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)偵偵聽連接接請(qǐng)求Listen命令命令代碼碼:NCBLISTEN、、NCBLISTEN||ASYNCH命令功能能:偵聽聽遠(yuǎn)程工工作站的的會(huì)話呼呼叫(Call)請(qǐng)求,建建立一個(gè)個(gè)會(huì)話。。NCB輸入:ncb__command=NCBLISTEN或NCBLISTEN||ASYNCHncb__name:本地名字字ncb__callname:呼叫方的的名字,,“*””表示可可以響應(yīng)應(yīng)任何站站對(duì)本站的呼呼叫ncb__rto:接收時(shí)限限(以0.5s為單位))ncb__sto:發(fā)送時(shí)限限(以0.5s為單位))ncb__event:指定異步步命令完完成后需需觸發(fā)的的事件句句柄,同同步命令令時(shí)為““空”NCB輸出:ncb__lsn:分配的本本地會(huì)話話號(hào)ncb__cmd_cplt::命令的最最終返回回碼注意:1、ncb__callname字段的第第一個(gè)字字節(jié)為**號(hào)號(hào),則可可以響應(yīng)應(yīng)任何站站對(duì)本站站的呼叫叫。如果果Listen命令成功功,NetBIOS就會(huì)返回回一個(gè)本本地會(huì)話話號(hào)lsn,,供后面的的發(fā)送、、接收、、掛機(jī)命命令引用用。2、Call/Listen命令可以以多次被被使用,,在同一一對(duì)命令令間建立立多個(gè)會(huì)會(huì)話。3、Listen命令是沒沒有超時(shí)時(shí)機(jī)制的的,應(yīng)避避免使用用Wait方式,否否則有可可能產(chǎn)生生無限等等待。4、在會(huì)會(huì)話過程程中發(fā)送送超時(shí)和和接收超超時(shí)的時(shí)時(shí)限應(yīng)在在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)數(shù)數(shù)據(jù)發(fā)送送Send命令命令代碼碼:NCBSEND、NCBSEND|ASYNCH命令功能能:向指指定的會(huì)會(huì)話方發(fā)發(fā)一個(gè)長長度為1~65535字節(jié)的的消息NCB輸入:ncb__command=NCBSEND或NCBSEND|ASYNCHncb__lsn:本地會(huì)話話號(hào)ncb__buffer:指定要發(fā)發(fā)送數(shù)據(jù)據(jù)的緩存存地址ncb__length:要發(fā)送數(shù)數(shù)據(jù)的字字節(jié)數(shù)ncb__event:指定異步步命令完完成后需需觸發(fā)的的事件句句柄,同同步命令令時(shí)為““空”NCB輸出:ncb__cmd_cplt::命令的最最終返回回碼注意:發(fā)發(fā)送的時(shí)時(shí)限是在在Call或Listen中指定的的,如果果超時(shí)的的時(shí)候?qū)?duì)方還沒沒有收到到數(shù)據(jù),,則會(huì)話話非正常常終止,,返回超超時(shí)出錯(cuò)錯(cuò)信息。。此外,,不論何何種原因因造成Send不能完成成,都會(huì)會(huì)使會(huì)話話終止,,返回響響應(yīng)的出出錯(cuò)信息息。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)數(shù)數(shù)據(jù)接收收Receive命令命令代碼碼:NCBRECV、NCBRECV|ASYNCH命令功能能:接收收由會(huì)話話方發(fā)過過來的數(shù)數(shù)據(jù)。NCB輸入:ncb__command=NCBSEND或NCBSEND|ASYNCHncb__lsn:本地會(huì)話話號(hào)ncb__buffer:接收緩存存區(qū)指針針ncb__length:接收緩沖沖區(qū)長度度ncb__event:指定異步步命令完完成后需需觸發(fā)的的事件句句柄,同同步命令令時(shí)為““空”NCB輸出:ncb__length:實(shí)際收到到的字節(jié)節(jié)數(shù)ncb__cmd_cplt::命令的最最終返回回碼注意:接接收的時(shí)時(shí)限是在在Call或Listen中指定的的,如果果接收超超時(shí),不不會(huì)引起起會(huì)話終終止。如如果給Recevie命令規(guī)定定的緩存存長度小小于要接接收的數(shù)數(shù)據(jù)長度度,則會(huì)會(huì)發(fā)生錯(cuò)錯(cuò)誤,這這時(shí)可以以再發(fā)一一條Receive命令,接接收剩余余的數(shù)據(jù)據(jù)(但必必須在超超時(shí)之前前完成))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)關(guān)關(guān)閉會(huì)話話HangUp命令命令代碼碼:NCBHANGUP、、NCBHANGUP||ASYNCH命令功能能:在會(huì)會(huì)話結(jié)束
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GA 872-2010防爆球》專題研究報(bào)告
- 企業(yè)設(shè)備管理規(guī)范制度
- 企業(yè)財(cái)務(wù)預(yù)算與審核制度
- 2026湖北省定向湖南大學(xué)選調(diào)生招錄參考題庫附答案
- 2026湖南益陽沅江市衛(wèi)生事業(yè)單位編外臨聘人員招聘9人備考題庫附答案
- 2026福建省面向北京師范大學(xué)選調(diào)生選拔工作參考題庫附答案
- 公共交通智能調(diào)度管理制度
- 2026貴州黔南州長順縣醫(yī)療集團(tuán)中心醫(yī)院招聘備案編制人員21人備考題庫附答案
- 紀(jì)檢監(jiān)察知識(shí)講課課件
- 2026陜西省面向中南大學(xué)招錄選調(diào)生考試備考題庫附答案
- 2025年公民素質(zhì)養(yǎng)成知識(shí)考察試題及答案解析
- 老年人營養(yǎng)和飲食
- 《關(guān)鍵軟硬件自主可控產(chǎn)品名錄》
- 2025年濟(jì)南市九年級(jí)中考語文試題卷附答案解析
- 信息安全風(fēng)險(xiǎn)評(píng)估及應(yīng)對(duì)措施
- 紅藍(lán)黃光治療皮膚病臨床應(yīng)用專家共識(shí)(2025版)解讀
- 錄音棚項(xiàng)目可行性研究報(bào)告
- (標(biāo)準(zhǔn))警局賠償協(xié)議書
- GB/T 20921-2025機(jī)器狀態(tài)監(jiān)測與診斷詞匯
- 人教版英語九年級(jí)全一冊(cè)單詞表
- 護(hù)工培訓(xùn)課件內(nèi)容
評(píng)論
0/150
提交評(píng)論