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