本文介紹了NetBIOS編程的一些基本概念,并通過一個(gè)異步事件服務(wù)器和一個(gè)異步事件客戶機(jī)的例子,詳細(xì)說明了NetBIOS進(jìn)行Windows編程的基本方法。文中涉及的程序在Windows98環(huán)境下,由VC++6.0編譯通過。
“網(wǎng)絡(luò)基本輸入/輸出系統(tǒng)”(Network Basic Input/Output System,NetBIOS)是1983年由Sytex公司為IBM公司開發(fā)的一種標(biāo)準(zhǔn)應(yīng)用程序編程接口,并被微軟采用。1985年,IBM改進(jìn)了NetBIOS,推出了NetBIOS擴(kuò)展用戶接口(NetBIOS Extended User Interface,NetBEUI)通信協(xié)議,它占用內(nèi)存少,配置簡(jiǎn)單,適用于小型局域網(wǎng)不同計(jì)算機(jī)之間的通信,但不具有跨網(wǎng)段工作的能力,不支持路由機(jī)制。NetBIOS是一種與“協(xié)議無關(guān)”的編程接口,它使應(yīng)用程序不用理解網(wǎng)絡(luò)細(xì)節(jié),應(yīng)用程序可通過TCP/IP、NetBEUI、SPX/IPX運(yùn)行。下面我們介紹以下NetBIOS編程用到的一些重要概念及其實(shí)現(xiàn)方法。
一、理解NetBIOS
1、 LANA編號(hào)
理解LAN適配器(LAN Adapter,LANA)編號(hào)是NetBIOS進(jìn)行網(wǎng)絡(luò)編程的關(guān)鍵所在。網(wǎng)絡(luò)的傳輸協(xié)議是通過LANA編號(hào)同NetBIOS對(duì)應(yīng)起來,每個(gè)LANA編號(hào)對(duì)應(yīng)于網(wǎng)卡及傳輸協(xié)議的唯一組合。因此,我們?cè)诰幊虝r(shí)要注意,兩臺(tái)要進(jìn)行通信計(jì)算機(jī)必須至少安裝有同一種協(xié)議,并且這兩臺(tái)計(jì)算機(jī)通信所依賴的LANA編號(hào)對(duì)應(yīng)的網(wǎng)絡(luò)協(xié)議要相同,否則即使這兩臺(tái)計(jì)算機(jī)安裝相同的協(xié)議也無法進(jìn)行通信。LANA編號(hào)范圍在0到9之間,其中,LANA 0代表默認(rèn)的LANA。
2、 NetBIOS名字
NetBIOS名字可分為兩種類型:唯一名字(Unique Name)和組名(Group Name)。顧名思義,唯一名字只允許一臺(tái)計(jì)算機(jī)注冊(cè)該名字,一旦唯一名字注冊(cè)成功,其他計(jì)算機(jī)如果再注冊(cè)該名字,就會(huì)出現(xiàn):“名字重復(fù)”的錯(cuò)誤,微軟網(wǎng)絡(luò)中的機(jī)器名采用的就是NetBIOS唯一名字。組名則是一組計(jì)算機(jī)的總稱,可以用來接收發(fā)給這一組計(jì)算機(jī)的數(shù)據(jù)。值得注意的是:組名可以和唯一名字同名,這會(huì)引起發(fā)送或接收數(shù)據(jù)的目的出現(xiàn)錯(cuò)誤!NetBIOS名字長(zhǎng)度為16個(gè)字符,其中第16個(gè)字符用于區(qū)分不同的網(wǎng)絡(luò)服務(wù)。關(guān)于計(jì)算機(jī)注冊(cè)NetBIOS名字的信息可以利用Nbtstatming令查看。
3、 NetBIOS提供的服務(wù)
NetBIOS提供兩種服務(wù):面向連接的服務(wù)和數(shù)據(jù)報(bào)服務(wù)(無連接)。面向連接的服務(wù)為兩臺(tái)需要進(jìn)行通信的計(jì)算機(jī)建立一個(gè)連接,并利用錯(cuò)誤探測(cè)和恢復(fù)機(jī)制保證數(shù)據(jù)在通信的兩端準(zhǔn)確無誤的傳輸,它適于傳輸比較長(zhǎng)的消息。對(duì)于NetBIOS,服務(wù)器在對(duì)想通過它建立通信的LANA編號(hào)上注冊(cè),而對(duì)于位于其他計(jì)算機(jī)上的客戶機(jī)會(huì)搜索服務(wù)器注冊(cè)的名字,并將它解析為機(jī)器名,然后發(fā)出進(jìn)行通信的請(qǐng)求。
數(shù)據(jù)報(bào)服務(wù)是無連接的,因而它不能保證數(shù)據(jù)有序、正確的傳輸,但它可以節(jié)省建立連接的開銷,它適合短消息的傳輸。在NetBIOS中,客戶機(jī)只是將發(fā)送數(shù)據(jù)的目的地定義為服務(wù)器注冊(cè)的進(jìn)程名,而不進(jìn)行任何連接。
二、NetBIOS編程的實(shí)現(xiàn)
NetBIOS的所有函數(shù)聲明、常數(shù)都在頭文件“Nb30.h”中定義,在編程時(shí)還須與Netapi32.lib庫進(jìn)行鏈接。NetBIOS接口通過一個(gè)函數(shù)實(shí)現(xiàn):
UCHAR Netbios (PNCB pNCB);
其中,參數(shù)pNCB指向一個(gè)網(wǎng)絡(luò)控制塊(Net Control Block,NCB)指針,NCB結(jié)構(gòu)如下:
typedef struct _NCB {
UCHAR ncb_command; // NetBIOSming令
UCHAR ncb_retcode; // 指定操作的返回代碼
UCHAR ncb_lsn; // 本地會(huì)話編號(hào)
UCHAR ncb_num; // 本地名字編號(hào)
PUCHAR ncb_buffer; // 數(shù)據(jù)緩沖區(qū)地址
WORD ncb_length; // 緩沖區(qū)長(zhǎng)度
UCHAR ncb_callname[NCBNAMSZ]; // 遠(yuǎn)程應(yīng)用程序名
UCHAR ncb_name[NCBNAMSZ]; // 本地應(yīng)用程序名
UCHAR ncb_rto; // 接收操作延時(shí)
UCHAR ncb_sto; // 發(fā)送操作延時(shí)
void (CALLBACK *ncb_post)( struct _NCB * );
// 異步ming令完成后需調(diào)用的后例程地址
UCHAR ncb_lana_num; // LANA 編號(hào)
UCHAR ncb_cmd_cplt; // 指定操作的返回代碼
UCHAR ncb_reserve[10]; // 保留字段
HANDLE ncb_event; // Win32事件句柄
} NCB, *PNCB;
此外,編程時(shí)應(yīng)注意調(diào)用NetBIOS函數(shù)的同步和異步問題。NetBIOSming令調(diào)用本身均為同步,即在完成指定ming令之前,會(huì)一直調(diào)用NetBIOS模塊。而在實(shí)際編程時(shí),我們通常需要進(jìn)行異步調(diào)用,即希望允許多個(gè)客戶機(jī)同時(shí)與服務(wù)器進(jìn)行連接,這就需要讓NetBIOSming令與異步標(biāo)志邏輯或(OR)操作,但必須在ncb_post字段中指定一個(gè)后例程,或在ncb_event字段中指定一個(gè)事件句柄。
下面,我以實(shí)現(xiàn)一個(gè)異步事件服務(wù)器和一個(gè)異步事件客戶機(jī)為例,具體說明NetBIOS的編程實(shí)現(xiàn),其中,服務(wù)器接收由客戶機(jī)發(fā)送的數(shù)據(jù)。
1、 異步事件服務(wù)器的實(shí)現(xiàn)
首先,我們進(jìn)行初始化工作,列舉可用的LANA編號(hào),并重設(shè):
if (LanaEnum(&lenum) != NRC_GOODRET)
return 1;
if (ResetAll(&lenum, (UCHAR)MAX_SESSIONS, (UCHAR)MAX_NAMES,FALSE) != NRC_GOODRET)
return 1;
&lenum是一個(gè)LANA_ENUM結(jié)構(gòu)變量,其定義如下:
typedef struct LANA_ENUM
{
UCHAR length ;
UCHAR lana[MAX_LANA+1] ;
} LANA_ENUM, *PLANA_ENUM;
其中,length指出本地計(jì)算機(jī)可用的LANA的數(shù)量,lana表示由這些LANA編號(hào)組成的一個(gè)數(shù)組。
新聞熱點(diǎn)
疑難解答