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结构清零。