NetBIOS同時提供了“面向連接”服務以及“無連接”服務。面向連接的服務,是指它允許兩個客戶機相互間建立一個會話,或者說建立一個“虛擬回路”。這種會話實際是一種雙向的通信數據流,通信的每一方都可向另一方發送消息。面向連接的服務可擔保在兩個端點之間,任何數據都能准確無誤的傳遞。在這種服務中,服務器通常將自己注冊到一個已知的名字下。客戶機會搜尋這個名字,以便建立與服務器的通信。就拿NetBIOS的情況來說,服務器進程會針對想通過它建立通信的每一個LANA編號,將自己的名字加入與其對應的名字表。而對於其他機器上的客戶來說,就可將一個服務名解析成機器名,然後要求同服務器進程建立連接。大家可以看到,為建立這種虛擬回路,必須采取一些適當的步驟。而且在初次建立連接的時候,還會牽涉到一些額外的開銷。“面向連接”或“面向會話”的通信可保證通信具有極高的可靠性,而且數據包的收發順序也能保證正確無誤。然而,它仍然是一種“以消息為基礎”的服務。也就是說,假如已連接好的某個客戶機執行一個“讀”命令,那麼服務器在流中仍然只會返回一個數據包——盡管客戶機此時提供了一個足夠大的緩沖區,可同時容下幾個包!
“無連接”或數據報服務中,服務器並不將自己注冊到一個特定的名下,而只是由客戶機收集數據,然後將其送入網絡,事前不必建好任何連接(即無連接)。對於數據的目的地址,客戶機會將其定義成服務器相應進程對應的NetBIOS名字。這種類型的服務不提供任何保障,但同面向連接的服務相比,卻可有更好的性能,如在使用數據報服務時,省下了建立連接所需的開銷。例如,客戶機可能向服務器興沖沖的一下子發出數千字節的數據,但那台服務器早在一兩天前便已當機了。除非依賴自服務器傳來的響應,否則客戶機永遠都收不到任何錯誤提示。
現在我們已理解了NetBIOS的一些基本概念,接下來要討論的是NetBIOS的設置,只有一個函數:
UCHAR Netbios(PNCB pNCB);
用於NetBIOS的所有函數聲明、常數等等均是在頭文件Nb30.h內定義的。若想連接NetBIOS應用,唯一需要的是庫Netapi32.lib。該函數最重要的特征便是pNCB這個參數,她對應於指向某個網絡控制塊(NCB)的一個指針。在那個NCB結構中,包含了為執行一個NetBIOS命令,相應的NetBIOS函數需要用到的全部信息。該結構的定義如下:
typedef struct _NCB
{ UCHAR ncb_command;
UCHAR ncb_retcode;
UCHAR ncb_lsn;
UCHAR ncb_num;
PUCHAR ncb_buffer;
WORD ncb_length;
UCHAR ncb_callname[NCBNAMESZ];
UCHAR ncb_name[NCBNAMEZ];
UCHAR ncb_rto;
UCHAR ncb_sto;
void (*ncb_post)(struct _NCB *);
UCHAR ncb_lana_num;
UCHAR ncb_cmd_cplt;
UCHAR ncb_reserve[10];
HANDLE ncb_event;
}* PNCB.NCB
進行任何NetBIOS調用之前,不要一開始就填寫結構內成員,而應先將這個NCB結構清零。