一、NetBIOS/NetBEUI协议编程
网络基本输入/输出系统”(NetworkBasic Input/Output System,NetBIOS)是一种标准的应用程序编程接口(Application Programming Interface,API),于1983年由Sytek公司专为IBM开发的网络通信编程接口。1985年,IBM在NetBIOS的基础上进行了扩展,创制了NetBIOS扩展用户接口(NetBIOS Extended User Interface,NetBEUI),它同NetBIOS接口集成后,共同构成了一套完整的协议。
1. NetBIOS开发简介
NetBIOS协议既可以是一个面向连接的数据包服务,也可以是面向非连接的对话服务。早期的NetBIOS只适用于局域网中,本身不存在路由功能,并且总节点数据有限,为了在企业网Intranet和互联网Internet中也能使用NetBIOS,人们开发了NBT(NetBIOS overTCP),该接口是将NetBIOS运行在TCP协议上,将NetBIOS的协议数据包内容作为TCP/IP协议的数据,通过TCP/IP协议提供的路由功能,送到目标主机后,再将TCP/IP协议中的“数据”还原成NetBIOS协议内容,然后再使其在目标主机上得到应用。这种“协议A-协议B-协议A”的模式称为“隧道技术”(TunnellingTechnology)。
在NetBIOS的开发中,主要涉及如下几个概念。
(1)名字注册与注销
当一台安装有NetBIOS协议的主机申请加入某一网络时,首先通过广播寻找NetBIOS名称服务器(NetBIOS Name Server),并同时向该服务器注册自己的“NetBIOS名称”。
当主机要退出网络时,会同样通过广播向NetBIOS名称服务器发送一个名称注销申请,名称服务器接到注销申请后将自己维护的名称列表中相应项进行清除。
(2)名称解析
当一个NetBIOS主机想和另一个NetBIOS主机通信时,首要的问题就是找到对方(也包含知道对方是否在网中),并通知对方要进行通信。实现这一功能可以通过广播的方式在网内通知所有主机,然后通过回复获知,也可以通过向NetBIOS名称服务器提出查询请求来实现。
在NBT中,NetBIOS 名称解释服务采用UDP端口137。
(3)NetBIOS数据包
NetBIOS 数据包服务提供无连接的、非顺序的、不可靠的数据包传送。因而数据包既可以直接向另一个NetBIOS主机发送,也可以通过广播方式传送所有主机。
在NBT中,NetBIOS数据包服务采用UDP端口138。
(4)NetBIOS对话
NetBIOS对话服务提供连接导向的、顺序的、可靠的NetBIOS信息传送。在NBT中,NetBIOS对话采用TCP连接,提供对话创建,保持和终止状态。对话服务允许在两个方向上采用TCP端口139进行并发的数据传输。
2. NetBIOS的调用
根据调用的层次不同,可以把NetBIOS的调用分成从低到高的三个级别:汇编级、Windows API函数级和封装后的Windows API调用。
无论应用程序在哪个层次中调用,最终都只使用一个Netbios函数,一套协议中所有功能都只用一个函数实现。该函数的原型是:
UCHAR Netbios(PNCBpncb);
参数pncb:指向一个NCB结构的指针。
该函数需要平台的支持,所以要使用此函数有代码前面需要包含头文件Nb30.h,并且链接静态链接库文件Netapi32.lib。
在该函数中,用一个NCB结构来完成所有命令,该结构是一个64 字节的缓冲区(64位的操作系统中是72个字节),该结构的定义如下:
#define NCBNAMSZ 16
typedef struct _NCB {
UCHAR ncb_command; //命令码
UCHAR ncb_retcode; // 命令返回码
UCHAR ncb_lsn; //本地对话序号
UCHAR ncb_num; // 本地网络名称的数量
指向所发送的数据;当作接收功能(NCBRECV)或查询命令(NCBSSTAT)时,命令将读后的值放到这个指向所指向的缓冲区中。
WORD ncb_length;
UCHAR ncb_callname[NCBNAMSZ];
UCHAR ncb_name[NCBNAMSZ];
UCHAR ncb_rto; //设定接收超时值
UCHAR ncb_sto; //设定发送超时值
void (CALLBACK *ncb_post) (struct _NCB *); //同步命令完成时,要通知的线程地址
UCHAR ncb_lana_num; //执行本次命令的网卡序号。
UCHAR ncb_cmd_cplt;
UCHAR ncb_reserve[10];
HANDLE ncb_event;
} NCB,*PNCB;
返回值:如果NCB结构中,各成员的值互相矛盾,或不是合理的值,则返回NRC_BADNCB。如果NCB结构成员中,成员ncb_length的值不正确,或成员ncb_buffer无效,则返回NRC_BUFLEN。
NCB 命令分为同步命令和异步命令,异步命令在调用结束后即返回,同步命令则需要等命令完成或超时后才返回。
表面看NetBIOS只有一个Netbios函数,但实际使用中,该命令的各项功能取决于其中各参数的不同组合,因此其复杂程序也不亚于其他协议。正是因为此,Windows在此基础上,通过更多的API包装了NetBIOS的Netbios函数,该些函数也因功能不同而不同。
附:相关命令
二、Win Inet高层编程
indows的开发者分别提供了比Socket更高层的编程接口,统称为Win Inet高级编程。通过对这些接口API的调用,使程序员可以从底层Socket的接口中脱离出来,而只需要关心高层WWW、FTP、Gopher协议的具体内容即可,大大提高了开发效率。同样,也可以利用其提供的接口,做出简单明了的扫描器,即基于应用的服务扫描器。
三、命名管道和邮槽高层编程
对于Socket编程,无论是基于面向连接的,还是面向非连接的,其实都有一个固定的编程框架。在此框架下,所需要做的只是高层上基于应用的开发,既然这样,理所当然地可以构想一种机制,能在“封装”(这里的封装不是面向对象的封装)了这个框架的基础上,只向用户提供基于高层协议的开发,而命名管道(Named Pipe)和邮槽(Mailslot)正是针对这一构想而设计的。
命名管道其实就是对TCP协议的一种更高层的封装,这种封装可以使使用者不必关心TCP协议中的各项控制细节,而只需要知道主要的几个参数,就可以方便地在多台主机之间进行面向连接的可靠通信。
邮槽则是对UDP协议的一种更高层的封装,邮槽是围绕一个广播通信体系设计的,所以不能实现可靠传输,只能应用在那种对数据传输的可靠性要求不高的地方。