

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第2章 基于NetBIOS的網(wǎng)絡(luò)編程 網(wǎng)絡(luò)根本輸入/輸出系統(tǒng)NetBIOS是一個(gè)傳統(tǒng)的運(yùn)用程序接口API,用于數(shù)據(jù)源和目的地之間的數(shù)據(jù)交換。 NetBIOS 同時(shí)兼容于較老的操作系統(tǒng),如O S / 2和D O S等。NetBIOS為程序提供了懇求低級(jí)網(wǎng)絡(luò)效力的一致命令集,從而實(shí)現(xiàn)了給局域網(wǎng)LAN提供網(wǎng)絡(luò)以及其他特殊功能的目的。 目前NetBIOS改良版NetBEUI與TCP/IP以及IPX/SPX合稱為L(zhǎng)AN通訊三大協(xié)議。此外,幾乎一切的LAN都是在NetBIOS協(xié)議根底上任務(wù)的。 .第2章 基于NetBIOS的網(wǎng)絡(luò)編程2.1 NetBIOS的根本概念2.2 NetBIOS命令2.3 數(shù)據(jù)報(bào)通
2、訊程序設(shè)計(jì)2.4 會(huì)話通訊程序設(shè)計(jì).2.1.1 NetBIOS概述 NetBIOS是一種規(guī)范的運(yùn)用程序編程接口API,1983年由Sytex公司專為IBM開(kāi)發(fā)勝利,它為網(wǎng)絡(luò)通訊定義了一種編程接口。1985年,IBM創(chuàng)建了NetBIOS擴(kuò)展用戶接口NetBEUI,它同NetBIOS接口集成在一同,構(gòu)成了一套完好的協(xié)議。后來(lái)由于NetBIOS接口愈來(lái)愈流行,所以各大廠商也開(kāi)場(chǎng)在其他如TCP/IP協(xié)議上實(shí)施NetBIOS程序接口。.NetBIOS特性1、NetBIOS API接口適用于為數(shù)眾多的網(wǎng)絡(luò)協(xié)議,使得程序接口“與協(xié)議無(wú)關(guān)。 2、NetBIOS協(xié)議短小精練,與TCP/IP和IPX/SPX相比具
3、有極高的網(wǎng)絡(luò)通訊性能,非常適用于實(shí)時(shí)性要求較高的小型LAN網(wǎng)絡(luò)環(huán)境3、NetBIOS同時(shí)提供了“面向銜接與“非面向銜接無(wú)銜接效力 .NetBIOS特性4、利用NetBIOS接口編程必需留意以下三個(gè)問(wèn)題: 為保證兩個(gè)NetBIOS運(yùn)用程序經(jīng)過(guò)網(wǎng)絡(luò)進(jìn)展正常通訊,那么對(duì)它們各自執(zhí)行的計(jì)算機(jī)來(lái)說(shuō),至少必需安裝一種兩者通用的協(xié)議 Microsoft TCP/IP和NetBEUI在默許的情況下已提供了NetBIOS接口,但是IPX/SPX卻并非如此; 與TCP/IP和IPX/SPX不同,NetBEUI不是一種“可路由協(xié)議,因此要想在兩個(gè)不同子網(wǎng)中保證兩個(gè)NetBIOS運(yùn)用程序正常通訊,那么在配置網(wǎng)絡(luò)時(shí),至
4、少應(yīng)安裝一種可路由的傳送協(xié)議。.NetBIOS在Windows中的運(yùn)用Windows的客戶機(jī)/效力器C/S網(wǎng)絡(luò)系統(tǒng)就是基于NetBIOS的網(wǎng)絡(luò);Windows NT操作系統(tǒng)中的大量的內(nèi)部聯(lián)網(wǎng)任務(wù)也都是利用NetBIOS來(lái)完成的。微軟還為許多協(xié)議提供了規(guī)范NetBIOS界面,如TCP/IP、NetBEUI和NWLink,使NetBIOS的運(yùn)用更加趨于方便網(wǎng)絡(luò)運(yùn)用舉例:閱讀網(wǎng)上鄰居、共享文件.Windows 2000/XP中的NetBIOS的設(shè)置DHCP是Dynamic Host Configuration Protocol的縮寫(xiě),它是TCPIP協(xié)議簇中的一種,主要是用來(lái)給網(wǎng)絡(luò)客戶機(jī)分配動(dòng)態(tài)的IP
5、地址。這些被分配的IP地址都是DHCP效力器預(yù)先保管的一個(gè)由多個(gè)地址組成的地址集,并且它們普通是一段延續(xù)的地址。在TCP/IP上運(yùn)用NetBIOS需求LMHOSTS與WINS效力器來(lái)注冊(cè)NetBIOS名字。.Windows 2000/XP中的NetBEUI的設(shè)置.2.1.2 LANA編號(hào)問(wèn)題:傳送協(xié)議與NetBIOS如何對(duì)應(yīng)起來(lái)呢? LANA編號(hào)LAN適配器編號(hào)定義:每個(gè)LANA編號(hào)對(duì)應(yīng)于網(wǎng)卡及傳輸協(xié)議的獨(dú)一組合。舉例:假定某任務(wù)站安裝了兩塊網(wǎng)卡,以及兩種具有NetBIOS才干地傳輸協(xié)議:TCP/IP和NetBEUI,那么總共就有4個(gè)LANA編號(hào)。.LANA編號(hào)下面是它們之間的一種對(duì)應(yīng)關(guān)系:
6、0 NetBEUI網(wǎng)卡1 1 TCP/IP網(wǎng)卡1 2 NetBEUI網(wǎng)卡2 3 TCP/IP網(wǎng)卡2 通常,LANA編號(hào)的范圍在09之間,除LANA 0之外,其它編號(hào)由操作系統(tǒng)自行分配,LANA 0表示的是“默許LANA假設(shè)某任務(wù)站裝有兩塊網(wǎng)卡以及三種具有NetBIOS才干的傳輸協(xié)議如TCP/IP、NetBEUI和IPX/SPX,那么它有多少個(gè)LANA編號(hào)?.2.1.3 NetBIOS名字NetBIOS是一種按名字任務(wù)的系統(tǒng),NetBIOS保管一張名字表,每個(gè)名字都是16字節(jié)長(zhǎng)。NetBIOS名字有兩種類型:獨(dú)一名:某個(gè)節(jié)點(diǎn)的運(yùn)用進(jìn)程在網(wǎng)絡(luò)中注冊(cè)的獨(dú)一無(wú)二的名字。組名:多個(gè)節(jié)點(diǎn)可擁有同一組名。主
7、要用于多點(diǎn)發(fā)送的數(shù)據(jù)通訊,.NetBIOS名字留意:1、為一個(gè)節(jié)點(diǎn)指定名字時(shí),留意不要用“*號(hào)或二進(jìn)制“0開(kāi)頭,也不要用“IBM這3個(gè)字母開(kāi)頭。2、對(duì)每個(gè)LANA來(lái)說(shuō),可以添加的名字的最大數(shù)量是254,名字號(hào)從1到2540和255由系統(tǒng)保管.2.1.4 NetBIOS接口函數(shù)NetBIOS API函數(shù): UCHAR NetbiosPNCB pncb1該函數(shù)只需一個(gè)參數(shù)pncb,它對(duì)應(yīng)于指向某個(gè)網(wǎng)絡(luò)控制塊NCB的一個(gè)指針,在NCB構(gòu)造中,包含了為執(zhí)行一個(gè)Netbios命令相對(duì)應(yīng)的Netbios函數(shù)需求用到的全部信息。構(gòu)造定義見(jiàn)書(shū)上P14P15:.typedef struct _NCB UCHAR
8、 ncb_command; /指定要執(zhí)行的 Netbios命令 UCHAR ncb_retcode; /指定操作的前往值 UCHAR ncb_lsn; /對(duì)應(yīng)一個(gè)本地交互編 號(hào),勝利執(zhí)行NCBCALL或NCBLISTEN 命令后,函數(shù)會(huì)前往一個(gè)新的交互編號(hào) UCHAR ncb_num; /指定本地名字的編號(hào), NCBADDNAME或NCBADDGRNAME命 令的每一次運(yùn)用,都會(huì)前往一個(gè)新的編號(hào) PUCHAR ncb_buffer; /指向數(shù)據(jù)緩沖區(qū) WORD ncb_length; /指定緩沖區(qū)的長(zhǎng)度 UCHAR ncb_callnameNCBNAMSZ; /指定 遠(yuǎn)程運(yùn)用程序名字 .UCH
9、AR ncb_nameNCBNAMSZ; /指定運(yùn)用程 序知的名字 UCHAR ncb_rto; /設(shè)置接納操作的超時(shí)期限 UCHAR ncb_sto; /設(shè)置發(fā)送操作的超時(shí)期限 void (CALLBACK*ncb_post) (struct _NCB *); / 指定異步命令完成后需 要運(yùn)用的post例程的地址 UCHAR ncb_lana_num; /指定要在上面執(zhí)行命 令的LANA編號(hào) UCHAR ncb_cmd_cplt; /指定操作代碼的前往 值 UCHAR ncb_reserve10; /保管,必需為0 HANDLE ncb_event; /指定設(shè)置Nonsignaled 形狀的
10、一個(gè)windows事件對(duì)象的句柄 NCB,*PNCB; . 并不是在對(duì)NetBIOS的每次調(diào)用中都需求用到Ncb構(gòu)造內(nèi)的全部成員,在調(diào)用一個(gè)NetBIOS命令時(shí)并不一定要填寫(xiě)每一個(gè)NCB域;此外,NCB中的一些域具有輸出參數(shù)的功能,命令執(zhí)行后的前往值將填充到這些域中。 還該當(dāng)留意的是,在填寫(xiě)NCB構(gòu)呵斥員之前,必需對(duì)這個(gè)NCB構(gòu)造清零,消除殘留參數(shù)的影響,然后再開(kāi)場(chǎng)填寫(xiě)構(gòu)造內(nèi)的相應(yīng)成員。.UCHAR AddName(CHAR * Name,UCHAR Lana,UCHAR * NameNum) NCB ncb; memset(&ncb,0,sizeof(NCB); ncb.ncb_comman
11、d=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運(yùn)用函數(shù)Netbios必需留意: 程序的頭文件中必需包含“nb30.h: include 程序在鏈接時(shí)參與“netapi32.lib: pragma comment(lib,“netapi32.lib).2.2 NetBIOS命令 NetBIOS的一切功能都是經(jīng)過(guò)執(zhí)行一系列的命令來(lái)完成的,共26條命令。
12、 1NetBIOS命令中大多命令都有同步等待或異步非等待兩種形狀,一切命令默以為同步: 同步形狀:命令原型 異步形狀:命令原型|ASYNCH . 同步方式和異步方式的比較: 采用同步方式時(shí),NetBIOS要等到該命令完成之后才干前往到他的程序。采用異步方式時(shí),將后續(xù)處置程序的地址或一個(gè)事件句柄通知給NetBIOS,然后NetBIOS立刻前往到當(dāng)前程序,當(dāng)該命令執(zhí)行完成時(shí)將自動(dòng)喚醒處置程序或觸發(fā)相應(yīng)的事件。 為了提高程序的執(zhí)行效率,通常采用異步方式,只需少數(shù)幾個(gè)NetBIOS命令必需采用同步方式,如NetBIOS復(fù)位命令。 .226條命令分類: 控制和測(cè)試命令5條: 控制命令3條:NCBRESE
13、T、NCBCANCEL、NCBUNLINK; 測(cè)試命令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、NC
14、BRECV、NCBRECVANY、NCBHANGUP 其他5條: NCBACTION、NCBENUM、NCBFINDNAME、NCBLANSTALERT、NCBTRACE.2.3 根本程序2.3.1 初始化程序2.3.2 加名字與刪除名字.2.3.1 初始化程序 NetBIOS的初始化程序主要包括兩個(gè)函數(shù):EnumLana():獲得當(dāng)前一切可用的網(wǎng)卡編號(hào)0254ResetNcb():復(fù)位指定網(wǎng)卡上的NetBIOS接口,并重設(shè)相關(guān)的環(huán)境參數(shù) ResetNcb()必需在一切NetBIOS運(yùn)用中首先被執(zhí)行,只需初始化勝利,才干進(jìn)展后面的任務(wù)。.LanaEnum()NCB輸入: ncb_command
15、 = NCBENUM ncb_buffer: 分配一個(gè)LANA_ENUM構(gòu)造 ncb_length: 設(shè)為L(zhǎng)ANA_ENUM構(gòu)造的長(zhǎng)度NCB輸出: ncb_cmd_cplt: 命令的最終前往碼,勝利為NRC_GOODRET 假設(shè)命令勝利執(zhí)行,那么會(huì)填充指定的LANA_ENUM構(gòu)造,其構(gòu)造定義如下:Typedef struct LANA_ENUM UCHAR length; /指出本地計(jì)算機(jī)共有多少個(gè)LANA編號(hào) UCHAR lanaMAX_LANA; /由實(shí)踐的LANA編號(hào)構(gòu)成的一個(gè)數(shù)組, 而length值指出lana數(shù)組內(nèi)有多少個(gè)元素會(huì)被填充LANA編號(hào)。.UCHAR LanaEnum(LA
16、NA_ENUM *lenum) NCB ncb; UCHAR ucRc; 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);.ResetNcbNCB輸入: ncb_command = NCBRESET ncb_callname0:可同時(shí)進(jìn)展的最大會(huì)話數(shù)0為缺省 ncb_callname2:可添加的最大NetBIOS名字?jǐn)?shù)0為缺省 ncb_callna
17、me3:能否允許主機(jī)名作為本人的NetBIOS名字 ncb_lana_num: 指定要執(zhí)行復(fù)位的LANA編號(hào)NCB輸出: ncb_cmd_cplt: 命令的最終前往碼,勝利為 NRC_GOODRET0 .UCHAR RestNCB(UCHAR lana) NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBRESET; ncb.ncb_callname0=MAXSESSIONS; ncb.ncb_callname2=MAXNAMES; ncb.ncb_callname3=TRUE; ncb.ncb_lana_nu
18、m=lana; ucRc=Netbios(&ncb); return(ucRc);.初始化NetBIOS程序例如.改造main()函數(shù)void main() LANA_ENUM lenum; UCHAR ucRc; int i; PNCB pncb; ucRc=LanaEnum(&lenum); if(ucRc!=0) printf(LanaEnum Error code:%d,ucRc); return; else printf(LanaEnum ok!%dn,lenum.length); for(i=0;incb_command=NCBDGSEND; strcpy(char *)pncb-
19、ncb_callname,(char * )DestName); pncb-ncb_num=Num; pncb-ncb_buffer=pBuffer; pncb-ncb_length=Length; Netbios(pncb);.數(shù)據(jù)報(bào)接納函數(shù)DatagramRecv()NCB輸入: ncb_command = NCBDGRECV|ASYNCH ncb_num: 本地名字號(hào)接納方為本人注冊(cè)的名字編號(hào) ncb_callname: 發(fā)送方的NetBIOS名字 ncb_buffer: 指向接納緩沖區(qū)的指針 ncb_length: 接納緩沖區(qū)的長(zhǎng)度1512字節(jié) ncb_event: 指定異步命令完成后
20、需觸發(fā)的事件句柄,同步命令為“空NCB輸出: ncb_cmd_cplt: 命令的最終前往碼,勝利為 NRC_GOODRET.void DatagramRecv(PNCB pncb,UCHAR * Name,UCHAR Num, HANDLE hEvent,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
21、_length=512; pncb-ncb_cmd_cplt=0 xff; pncb-ncb_event=hEvent; Netbios(pncb);.1創(chuàng)建事件HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEvent,/平安屬性 BOOL bManuaReset,/能否人工重置 BOOL bInitialState, /初始能否有信號(hào)形狀 LPCTSTR lpName /名字).DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) hHandle:同步對(duì)象句柄 dwMillis
22、econds:以毫秒為單位的超時(shí)間隔.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); if(hEvent=NULL) return;.DatagramRecv(&RecvNcb,(UCHAR *)RemoteName,LocalNameNum,hEvent,buff);WaitForSingleObject(hEvent,0 xffffffff);.簡(jiǎn)單數(shù)據(jù)報(bào)通訊程序例如 發(fā)送方“abc不斷給接納方“xyz發(fā)送數(shù)據(jù)數(shù)據(jù)內(nèi)容由用戶指定,雙方直到收到一條“exit音訊后停頓通訊。.數(shù)據(jù)報(bào)發(fā)送程序.數(shù)據(jù)報(bào)接納程序.程序闡明1、發(fā)送方程序采用循環(huán)發(fā)送構(gòu)造,接納方程
23、序采用循環(huán)接納構(gòu)造。當(dāng)發(fā)送方從鍵盤上鍵入一個(gè)字符串后,發(fā)送程序?qū)⒃撟址鳛閿?shù)據(jù)報(bào)直接發(fā)送給接納方,接納方在收到一個(gè)數(shù)據(jù)報(bào)后,將收到的字符串顯示在屏幕上,假設(shè)發(fā)送方鍵入的是“exit,那么通訊雙方終了通訊,程序退出。2、接納方程序用到了兩個(gè)Windows API函數(shù):創(chuàng)建事件函數(shù)CreateEvent()和等待事件函數(shù)WaitForSingleObject(),利用這兩個(gè)函數(shù)的目的是用來(lái)配合處置異步接納命令。.2.3.2 組播與廣播通訊程序組播通訊程序設(shè)計(jì): 組播通訊與點(diǎn)對(duì)點(diǎn)通訊程序的構(gòu)造類似,所用的發(fā)送和接納命令也一樣,只是發(fā)送方在指定接受方的名字時(shí)應(yīng)設(shè)置為特定的遠(yuǎn)程組名,而多個(gè)接納方均應(yīng)運(yùn)
24、用一樣的組名來(lái)設(shè)置接納。這樣,只需發(fā)送方發(fā)送一個(gè)特定的組播數(shù)據(jù)報(bào),那些以特定組名等待接納的進(jìn)程均能同時(shí)接納到這個(gè)組播數(shù)據(jù)報(bào)。課堂練習(xí)作業(yè)1:擬寫(xiě)程序?qū)崿F(xiàn)組播通訊。.發(fā)送方 接納任務(wù)組ResetNcb()AddName()Send()DeleteName()ResetNcb()AddGRName()Recv()DeleteName()發(fā)送數(shù)據(jù)報(bào)到任務(wù)組.作業(yè)一P56頁(yè)2.3 2.4 2.5 2.62.10.廣播通訊程序設(shè)計(jì): 廣播通訊與組播通訊略有不同,主要差別在于: 1. 廣播發(fā)送與接納應(yīng)采用特定的廣播命令,廣播發(fā)送用NCBDGSENDBC命令,而廣播接納用NCBDGRECVBC命令 2. 由
25、于一切任務(wù)站均接納廣播音訊,因此發(fā)送方在發(fā)送廣播數(shù)據(jù)報(bào)時(shí)無(wú)需指定ncb_callname的值。.利用廣播通訊實(shí)現(xiàn)時(shí)間同步程序例如 假設(shè)有一個(gè)規(guī)范時(shí)間效力器,當(dāng)網(wǎng)內(nèi)一個(gè)任務(wù)站發(fā)出“對(duì)時(shí)懇求數(shù)據(jù)報(bào)后,規(guī)范時(shí)間效力器便以廣播方式發(fā)送一個(gè)規(guī)范時(shí)間,以同步局域網(wǎng)內(nèi)一切任務(wù)站的基準(zhǔn)時(shí)間。.時(shí)間效力器任務(wù)站ResetNcb()AddName()SendBaseTime()DeleteName()ResetNcb()AddName()RecvBaseTime()DeleteName()懇求基準(zhǔn)時(shí)間 WaitTimeRequest()發(fā)送基準(zhǔn)時(shí)間 RequestSystemTime().void SendBas
26、eTime(PNCB pncb,UCHAR Num, CHAR * pBuffer,WORD Length)memset(pncb,0,sizeof(NCB);pncb-ncb_command=NCBDGSENDBC;pncb-ncb_num=Num;pncb-ncb_buffer=pBuffer;pncb-ncb_length=Length;Netbios(pncb);注:不需求指定接納方名字.void RecvBaseTime(PNCB pncb,UCHAR Num, UCHAR * pBuffer) memset(pncb,0,sizeof(NCB); pncb-ncb_command=
27、NCBDGRECVBC; pncb-ncb_num=Num; pncb-ncb_buffer=pBuffer; pncb-ncb_length=512; pncb-ncb_cmd_cplt=0 xff; Netbios(pncb);.補(bǔ)充:NCBASTAT命令測(cè)試網(wǎng)絡(luò)中任一個(gè)目前正在任務(wù)的任務(wù)站的網(wǎng)絡(luò)適配器形狀。NCB輸入: ncb_command = NCBASTAT ncb_callname: 任務(wù)站名字 ncb_lana_num: 指定要執(zhí)行命令的LANA編號(hào) ncb_buffer: 形狀緩沖區(qū)指針 ncb_length: 形狀緩沖區(qū)長(zhǎng)度NCB輸出: ncb_cmd_cplt: 命令的最
28、終前往碼,勝利為 NRC_GOODRET(0).UCHAR Astatus(UCHAR lana, PVOID pBuffer, int cbBuffer,char *szName)NCB ncb;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
29、_cplt);.2.4 會(huì)話通訊程序設(shè)計(jì) 會(huì)話是一種面向銜接的可靠通訊方式。與數(shù)據(jù)報(bào)相比,會(huì)話通訊可以保證數(shù)據(jù)的完好性、抵達(dá)順序及傳輸?shù)目煽啃?。普通分成三個(gè)階段:建立銜接數(shù)據(jù)傳輸斷開(kāi)銜接.基于NetBIOS的會(huì)話通訊模型效力器客戶機(jī)ResetNcb()AddName()Listen()HangUp()ResetNcb()AddName()Call()HangUp()建立會(huì)話銜接Send/Recv()Recv/Send會(huì)話通訊DeleteName()DeleteName()封鎖會(huì)話.NetBIOS的會(huì)話通訊步驟 初始化。通訊雙方分別執(zhí)行NCBRESET命令,復(fù)位各自的NetBIOS。 添加名字。
30、為了建立會(huì)話,通訊雙方應(yīng)分別執(zhí)行NCBADDNAME命令,在各自的本地名字表中添加獨(dú)一名。.NetBIOS的會(huì)話通訊步驟 建立會(huì)話。在進(jìn)展會(huì)話通訊之前,必需首先建立一個(gè)會(huì)話銜接。該過(guò)程需由效力器和客戶機(jī)協(xié)同完成,效力器方運(yùn)用NCBLISTEN命令等待客戶機(jī)的銜接懇求,客戶方運(yùn)用NCBCALL命令向效力器發(fā)起會(huì)話銜接懇求。一旦會(huì)話建立勝利,在雙方的NetBIOS接口上便會(huì)建立一個(gè)會(huì)話,并分別為會(huì)話雙方賦予獨(dú)一的會(huì)話號(hào),以后通訊雙方就可以利用該會(huì)話號(hào)進(jìn)展會(huì)話通訊。.NetBIOS的會(huì)話通訊步驟 數(shù)據(jù)傳輸。會(huì)話建立后,雙方便可利用NCBSEND和NCBRECV等會(huì)話命令進(jìn)展會(huì)話通訊。 撤除會(huì)話。當(dāng)數(shù)
31、據(jù)傳輸終了后,任何一方均可發(fā)出NCBHANGUP命令來(lái)撤除指定會(huì)話號(hào)上的會(huì)話銜接,以及時(shí)釋放系統(tǒng)資源。 刪除名字。在會(huì)話通訊進(jìn)展終了后,雙方還應(yīng)刪除各自本地名字表中的名字。.會(huì)話通訊命令 NetBIOS的會(huì)話通訊命令共有9條,每條命令都有等待和非等待兩種方式,通常情況下發(fā)送方采用等待方式,而接納方那么采用非等待方式。.1發(fā)起銜接懇求Call命令命令代碼:NCBCALL,NCBCALL|ASYNCH命令功能:懇求與某個(gè)遠(yuǎn)程任務(wù)站建立一個(gè)會(huì)話. NCB輸入: ncb_command = NCBCALL 或 NCBCALL|ASYNCH ncb_name: 本地名字 ncb_callname: 遠(yuǎn)程
32、名字 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命令才行。假設(shè)Call命令勝利,NetBIOS即前往一個(gè)本地會(huì)話號(hào)LSN,供后面的會(huì)話通訊命令援用。假設(shè)Call命令呼叫的對(duì)方?jīng)]有發(fā)出Listen命令,那么Call命令會(huì)反復(fù)試幾次,最后前往出錯(cuò)信息。2、在會(huì)話過(guò)程中發(fā)送超時(shí)和接納超時(shí)的時(shí)限應(yīng)在Call命令中指定,而
33、不是在后面的發(fā)送/接納命令中指定的。ncb_sto發(fā)送時(shí)限和ncb_rto接納時(shí)限兩個(gè)字段的值是以0.5s為單位的,假設(shè)設(shè)為“0表示沒(méi)有超時(shí)機(jī)制,即可以無(wú)限期等待,這一點(diǎn)在運(yùn)用時(shí)要非常小心。.void NetbiosCall(PNCB pncb,char SourName,char DestName)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;pnc
34、b-ncb_sto=10;Netbios(pncb);.2偵聽(tīng)銜接懇求Listen命令命令代碼:NCBLISTEN、 NCBLISTEN|ASYNCH命令功能:偵聽(tīng)遠(yuǎn)程任務(wù)站的會(huì)話呼叫Call懇求,建立一個(gè)會(huì)話。. NCB輸入: ncb_command = NCBLISTEN或 NCBLISTEN|ASYNCH ncb_name: 本地名字 ncb_callname: 呼叫方的名字,“*表示可以呼應(yīng)任何站對(duì) 本站的呼叫 ncb_rto: 接納時(shí)限以0.5s為單位 ncb_sto: 發(fā)送時(shí)限以0.5s為單位 ncb_event: 指定異步命令完成后需觸發(fā)的事件句柄,同步命令時(shí)為“空 NCB輸出:
35、 ncb_lsn: 分配的本地會(huì)話號(hào) ncb_cmd_cplt: 命令的最終前往碼.留意:1、ncb_callname字段的第一個(gè)字節(jié)為 * 號(hào),那么可以呼應(yīng)任何站對(duì)本站的呼叫。假設(shè)Listen命令勝利,NetBIOS就會(huì)前往一個(gè)本地會(huì)話號(hào)lsn,供后面的發(fā)送、接納、掛機(jī)命令援用。2、Call/Listen命令可以多次被運(yùn)用,在同一對(duì)命令間建立多個(gè)會(huì)話。3、Listen命令是沒(méi)有超時(shí)機(jī)制的,應(yīng)防止運(yùn)用Wait方式,否那么有能夠產(chǎn)生無(wú)限等待。4、在會(huì)話過(guò)程中發(fā)送超時(shí)和接納超時(shí)的時(shí)限應(yīng)在Listen命令中指定。.void NetbiosListen(PNCB pncb,HANDLE hEvent,
36、char SourName,char DestName)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=0 xff;pncb-ncb_event=hEvent;Netbios(pncb);.3數(shù)據(jù)發(fā)送Send命令命令代碼:NCBSEND、 NCBSEND|ASYNCH命令
37、功能:向指定的會(huì)話方發(fā)一個(gè)長(zhǎng)度為165535字節(jié)的音訊. NCB輸入: ncb_command = NCBSEND或 NCBSEND|ASYNCH ncb_lsn: 本地會(huì)話號(hào) ncb_buffer: 指定要發(fā)送數(shù)據(jù)的緩存地址 ncb_length: 要發(fā)送數(shù)據(jù)的字節(jié)數(shù) ncb_event: 指定異步命令完成后需觸發(fā)的事件句柄,同步命令時(shí)為“空 NCB輸出: ncb_cmd_cplt: 命令的最終前往碼 留意:發(fā)送的時(shí)限是在Call或Listen中指定的,假設(shè)超時(shí)的時(shí)候?qū)Ψ竭€沒(méi)有收到數(shù)據(jù),那么會(huì)話非正常終止,前往超時(shí)出錯(cuò)信息。此外,不論何種緣由呵斥Send不能完成,都會(huì)使會(huì)話終止,前往呼應(yīng)的出
38、錯(cuò)信息。.void SessionSend(PNCB pncb,UCHAR Num,UCHAR * pBuffer,WORD Length)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ù)據(jù)接納Receive命令命令代碼:NCBRECV、 NCBRECV|ASYNCH命令功能:接納由會(huì)話方發(fā)過(guò)來(lái)的數(shù)據(jù)。. NCB輸入: ncb_command = NCBSEND或 NCBSEND|
39、ASYNCH ncb_lsn: 本地會(huì)話號(hào) ncb_buffer: 接納緩存區(qū)指針 ncb_length: 接納緩沖區(qū)長(zhǎng)度 ncb_event: 指定異步命令完成后需觸發(fā)的事件句柄,同步命令時(shí)為“空 NCB輸出: ncb_length: 實(shí)踐收到的字節(jié)數(shù) ncb_cmd_cplt: 命令的最終前往碼 留意:接納的時(shí)限是在Call或Listen中指定的,假設(shè)接納超時(shí),不會(huì)引起會(huì)話終止。假設(shè)給Recevie命令規(guī)定的緩存長(zhǎng)度小于要接納的數(shù)據(jù)長(zhǎng)度,那么會(huì)發(fā)生錯(cuò)誤,這時(shí)可以再發(fā)一條Receive命令,接納剩余的數(shù)據(jù)但必需在超時(shí)之前完成.void SessionRecv(PNCB pncb,UCHAR
40、Num,HANDLE hEvent,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=0 xff;pncb-ncb_event=hEvent;Netbios(pncb);.5封鎖會(huì)話Hang Up命令命令代碼:NCBHANGUP、 NCBHANGUP|ASYNCH命令功能:在會(huì)話終了時(shí),雙方都要發(fā)這條命令,表示封鎖會(huì)話。. NCB輸入: ncb_command = NCBHANGUP或 NCBHANGUP|ASYNCH ncb_lsn: 本地會(huì)話號(hào) ncb_event: 指定異步命令完成后需觸發(fā)的事件句柄,同步命令時(shí)為“空 NCB輸出: ncb_cmd_cplt: 命令的最終前往碼.void HangupSession(PNCB pncb,UCHAR SessionNum)memset(pncb,0,sizeof(NCB);pncb-ncb_c
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)士法規(guī)考試題及答案
- 起重機(jī)械作業(yè)人員考試題庫(kù)及答案
- 法考試題庫(kù)及答案
- 鋼結(jié)構(gòu)試題及答案
- 重慶中考物理試題及答案
- 學(xué)校管理試題及答案
- 漢川保安考試題及答案
- 油漆工考試試題及答案
- 品酒雅集活動(dòng)方案
- 團(tuán)購(gòu)活動(dòng)策劃方案方案
- 位置隨動(dòng)系統(tǒng)的MATLAB計(jì)算及仿真畢業(yè)設(shè)計(jì)說(shuō)明書(shū)
- 腦梗死的預(yù)防和治療
- 湖南省長(zhǎng)沙市2024年中考語(yǔ)文真題試卷(含答案)
- 2023-2024學(xué)年全國(guó)初中七年級(jí)下地理人教版期末考試試卷(含答案解析)
- 污水管網(wǎng)工程竣工驗(yàn)收?qǐng)?bào)告
- 初中七年級(jí)英語(yǔ)翻譯專項(xiàng)集中訓(xùn)練100題(含答案)
- 高中英語(yǔ)必背3500單詞表
- 藥物臨床試驗(yàn)監(jiān)查員(monitor)技能培訓(xùn)資料
- 大學(xué)語(yǔ)文(濱州學(xué)院)智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東航空學(xué)院
- 三相異步電動(dòng)機(jī)檢修課件
- 甲醇制氫操作專題規(guī)程
評(píng)論
0/150
提交評(píng)論