NetBios 的结构体详解(网络控制块NCB)

时间:2021-12-25 16:47:23

对之前网络基础编程用到控制块NCB进行介绍(补充):

在Win32环境下,使用VC++6.0进行NetBIOS程序开发时, 需要用到nb30.h文件和netapi32.lib静态链接库。前者定义了NetBIOS的所有函数声明和常数定义,后者定义了NetBIOS应用。

Ncb的结构在nb30.h文件中定义。Ncb结构的定义:Ncb有64个字符,分为14个域(或称为字段)和一个10字节的保留域,表2.1显示了Ncb和它的域。

NetBios 的结构体详解(网络控制块NCB)

NetBios 的结构体详解(网络控制块NCB)

域名及字节偏移量说明。

NetBios 的结构体详解(网络控制块NCB)

各个命令详细说明:

1. 命令 NetBIOS命令的使用方式有两种,即等待和非等待(或称为同步与异步)方式。如果命令码的高阶位是0时是等待方式,命令将阻止提交命令的应用程序继续执行,直到该NetBIOS命令执行完毕后才允许这个应用程序继续执行。NetBIOS每次只能处理一个等待方式命令。 如果命令码的高阶位是二进制1时则是非等待方式,命令由NetBIOS在内部排队,并不阻止提交命令的应用程序继续执行。应用程序可通过对命令结束标志字段值的轮询来了解命令执行的状态(详见命令结束字段介绍)。命令执行完毕后,最终的返回码存放在Ncb结构的命令结束标志字段中。NetBIOS每次可以挂起几个非等待方式命令。

2. 返回码 命令提交给NetBIOS驱动程序后,该命令的成功与否即在该字段中反映出来。若返回码字段值为00h,则表示命令成功。对于异步NetBIOS命令NetBIOS将立即在返回码字段中返回值FFh,表明该命令已经排队,即将执行。命令执行完毕后,该字段将置成最终的返回码。

3. 本地会话编号 同远程应用程序处理建立了会话后,NetBIOS驱动程序将相应设置该字段(局部会话号)。在随后的通信中,若想同远程处理进行通信,本地处理只需在Ncb结构中指明局部会话号,不再需要在本地会话编号字段中指定完整的远程处理逻辑名。 单就一个适配器而言,工作站上和每一个处理一次至多能进行254个会话,只要指定相关的局部会话号,就能达到会话的目的。系统保留值0和255,不将它们作为局部会话号使用。

4. 名字编号 工作站上的每一个处理最多可向名表中加进254个逻辑名。成功地将一逻辑名加进LANA的私有名表后,NetBIOS将置名字编号字段值为该名在名表中的索引值(索引值称为名号),在以后的同远程处理进行的非连接式通信中可使用这个名号。名号0和255亦为系统保留,其中适配器的物理地址总在名表第1项中。

5. 缓冲区地址 该字段的值是要发送的数据缓冲区的地址,或者要在其中存放接收到的数据的缓冲区的地址。

6. 缓冲区长度 该字段指定的是由缓冲区地址字段指定的缓冲区的长度。 接收到一块数据时,NetBIOS将相应设置该字段。

7. 调用(远程)名 调用(远程)名是一个由应用程序设置的16字节域,其值是远程处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。在远程驱动程序连接正期待着接收连接呼叫的本地处理时,NetBIOS将填写该字段。因此,接收呼叫的处理能够找出远程呼叫方的名。第一个字节为“*”代表任意远程名。

8. 本地名 本地名是由应用程序设置的16字节字段(所有的字节均有用),其值是本地处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。该字段的第一个字节不能是二进制0或星号;另外,IBM保留了头三个字节,所以头三个字节不能是IBM。最后,第16个字节不能是00h~1Fh之间的值。在局域网管理器环境下,最后一个字符(即第16个字节)有特殊的含义,具体如下表:

NetBios 的结构体详解(网络控制块NCB)

9. 接收超时 当期望从一个或数个远程处理接收到一个数据包时,应用程序可在接收超时(接收时间限制)字段中指定等待的最大时间数值(以1/2 s为间隔单位)。若超过了指定时间仍未接收到包,则NetBIOS驱动程序将在接收超时字段中返回错误。若接收超时字段值为00h,则表示阻止执行,直到本地处理接收到一个数据包。

10. 发送超时 发送超时(发送时间限制)字段类似于接收超时字段,但它指定的是等待NetBIOS连接式命令Send完成的时间。若超过了指定时间,则将返回错误。若发送超时字段值为00h,则表示不为发送操作指定时间限制。此时,命令将阻止执行,直到要么成功地发送了一个数据包,要么NetBIOS层停止了重试。

11. POST例程地址 在提交异步命令时,应用程序可以设置该字段。在MS-DOS中,应用程序将后处理例程的地址填在该字段中。所谓后处理例程,即命令执行完毕后NetBIOS驱动程序将要调用的例程。

12. LANA编号 一台工作站上可能有不止一个LANA卡或网络协议(或传输驱动程序),所以Ncb中的LANA编号字段是用来指明应用程序想使用哪一个网络适配器上的哪个网络协议的。该字段称为LAN适配器号或LANA号,LANA编号在0~9之间。

NetBios 的结构体详解(网络控制块NCB)

注意:只有基于相同NetBIOS协议的程序才能相互通信。 基于此,在设计程序时,服务器应用程序应对每个LANA编号上的客户机连接进行监听;客户机上的应用程序需要通过本机安装的每个LANA编号尝试进行连接。

13. 命令结束标志 NetBIOS驱动程序利用该字段来表明异步命令已完成。起先,当应用程序提交一条异步命令时,NetBIOS将置该字段值为FFh。待命令执行完毕后,再将最终值填入该字段。也就是说,提交了一条非等待命令后,应用程序可以监视(轮询)该字段的取值以了解命令是否完毕,直到其值不再是FFh为止。

14. 保留域 Ncb的保留域为10字节长的保留域,NetBIOS可能用它来返回扩充的错误信息。另外,NetBIOS在处理请求的过程中,用它来作暂存区。应用程序不应使用Ncb的保留域,因为一旦它遭到破毁,NetBIOS的行为将是不可预测的。

15. 事件句柄 在提交异步命令时,应用程序可以设置该字段。该域用于存放后处理例程的句柄。 注意:当命令域的设置使用ASYNCH(异步)标志时,该域的设置与POST例程地址域的设置互斥,即其中必须有一个域的设置为0,而另一个为非0值。