《二》NetBIOS/NrtBEUI协议编程
1. NetBIOS简介
NetBIOS协议既可以是一个面向连接的数据包服务,也可以是面向非连接的对话服务。早起的NetBIOS只适用于局域网,本身不存在路由功能,并且总结点数据有限。
后来开发了NTB(NetBIOS over TCP),该接口是将NetBIOS运行在TCP协议上,将NetBIOS的协议数据包作为TCP/IP协议的数据u,通过TCP/IP提供的路由功能,送到目标主机后,再将TCP/IP协议中的数据还原为NerBIOS协议内容,然后再使其在目标主机上得到应用。被称为隧道技术。
名字注册与注销
名称解析
NetBIOS数据包
NetBIOS对话
2. NetBIOS的函数调用
无论应用程序咋哪个层次中调用,最终只是用一个Netbios函数(注意不是NetBIOS)
- Netbios函数
UCHAR Netbios(
PNCB pncb
);
参数pncb:指向一个NVB结构的指针。
在该函数最终,用一个NCB结构来完成所有命令,该结构是一个64字节的缓冲区(64位操作系统中是72个字节),该结构的调用如下:
#define NVBNAMSZ 16
typedef sturct _NCB{
UCHAR ncb_commend;
UCHAR ncb_retcode;
UCHAR ncb_lsn;
UCHAR ncb_num;
PUUCHAR ncb_buffer;
WORD ncb_length;
UCHAR ncb_callname[NCBNAMSZ];
UCHAR ncb_name[NCBNAMSZ];
UCHAR ncb_rto;
UCHAR ncb_sto;
void (CALLBACK *ncb_port) (struct _NCB);
UCHAR ncb_lana_num;
UCHAR ncb_cmd_cplt;
UCHAR ncb_reserve[10];
UCHAR ncb_event;
}NCB, *PNCB;
2. 结构成员如下:
- ncb_commend:命令码。指出该NCB所完成的功能,其余各成员是否使用,以及要设置成什么值则完全取决于该命令码。除了命令码之外,该值还可以通过操作符“|”与ASYNCH进行“逻辑或操作”,指定是否使用同步操作。可取的命令码主要有:
- ncb_retcode:命令返回码,如果是同步命令。并且还没有结束,则该值被设为NCB_PENDING;否则返回码如下值之一:
- ncb_lsn:本地对话序号,通过NCBCALL命令可以获得本地对话序号
- ncb_num:本地网络名称的数量。通过NCBADDNAME或NCBADDGRNAME命令可以获得网络名称的数量。注意,这里的数量,而不是网络名称本身。并且NAME_NUMBER_1代表第一个网络名称。
- ncb_buffer:指向一个缓冲区,当做发送功能(NCBSEND)时,该指向指向所发送的数据,当做接收功能(NCBRECV)或查询命令(NCBSSTAT)时,命令将读后值放到这个指向所指向的缓冲区中。
- ncb_length:ncb_buffer的长度。以字节为单位。当做发送功能(NCBSEND)时,如果该长度不对,则返回NRC_BUFLEN错误;当做接收功能(NCBRECV)时,如果该长度不足以装下所返回的值,则系统会设定实际所需要的长度。
- ncb_callname:指向远端名称,该名称最大长度为NCBNAMSZ。并不能按普通字符串处理方式处理
- ncb_name:指向远端的名称。该名称的最大长度为NCBNAMSZ。
- cb_rto:设定接收超时值。该值以500毫秒为一个单位,实际的超时值为所设值乘以500,如果设为0,表示没有超时值,一直等到有可以接收的数据。该命令主要应用于NCBRECV。
- ncb_sto:设定发送超时值。同ncb_rto一样,所设值乘以500毫秒作为超时值,0代表没有超时值,直到发送成功返回。该命令主要用于NCBSEND和NCBCHAINSEND命令中。
- ncb_post:同步命令完成时,逃通知的现成地址。
- ncb_lana_num:执行本次命令的网卡序号。
- ncb_cmd_cplt:命令完成标志。该值与ncb_retcode menber相似。
- ncb_reserve:保留,必须为0.
- ncb_event:指向一个事件句柄,当同步命令完成时,会复位该事件句柄。如果是异步命令(即命令码ncb_commend没有与ASYNCH进行“逻辑或”操作),则必须设置为0.