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