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

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

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

  Ncb的结构在nb30.h文件中定义。Ncb结构的定义:Ncb有64个字符,分为14个域(或称为字段)和一个10字节的保留域,表2.1显示了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个字节)有特殊的含义,具体如下表:

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协议的程序才能相互通信。 基于此,在设计程序时,服务器应用程序应对每个LANA编号上的客户机连接进行监听;客户机上的应用程序需要通过本机安装的每个LANA编号尝试进行连接。

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

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

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

NetBios 的结构体详解(网络控制块NCB),布布扣,bubuko.com

时间: 2024-10-11 00:08:43

NetBios 的结构体详解(网络控制块NCB)的相关文章

NetBios 的结构体详解

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

struct sk_buff结构体详解

struct sk_buff是linux网络系统中的核心结构体,linux网络中的所有数据包的封装以及解封装都是在这个结构体的基础上进行. struct sk_buff_head  {     struct sk_buff *next;     struct sk_buff *prev;          __u32 qlen;     spinlock_t lock; } struct sk_buff {     struct sk_buff *next;     struct sk_buff

struct ethhdr结构体详解

    在linux系统中,使用struct ethhdr结构体来表示以太网帧的头部.这个struct ethhdr结构体位于#include<linux/if_ether.h>之中. #define ETH_ALEN 6  //定义了以太网接口的MAC地址的长度为6个字节 #define ETH_HLAN 14  //定义了以太网帧的头长度为14个字节 #define ETH_ZLEN 60  //定义了以太网帧的最小长度为 ETH_ZLEN + ETH_FCS_LEN = 64个字节 #d

struct socket结构体详解

在内核中为什么要有struct socket结构体呢?    struct socket结构体的作用是什么?    下面这个图,我觉得可以回答以上两个问题.      由这个图可知,内核中的进程可以通过使用struct socket结构体来访问linux内核中的网络系统中的传输层.网络层.数据链路层.也可以说struct socket是内核中的进程与内核中的网路系统的桥梁.   struct socket {      socket_state  state; // socket state  

struct net_device网络设备结构体详解

在linux中使用struct net_device结构体来描述每一个网络设备.同时这个用来刻画网络设备的struct net_device结构体包含的字段非常的多,以至于内核的开发者都觉得在现在的linux内核中,这个struct net_device是一个大的错误.    在本篇文章中,只介绍struct net_device中的一些字段,其他的字段在以后使用的时候再说.    #define IFNAMSIZ 32    struct net_device    {        //用于

Linux下DIR,dirent,stat等结构体详解

摘要: 最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅. DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自<UNIX环境高级编程(第二版)>).函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用: 最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎

Foundation 框架中常用的结构体详解

Foundation 框架包含了很多开发常用的数据类型: Foundation中包含的数据类型: 结构体 枚举 类 要想使用 Foundation 中的数据类型,只要包含主头文件即可. #impot <Foundation/Foundation.h> 结构体: 我们常用的结构体有:NSRange.NSPoint (CGPint ).NSSize(CGSize).NSRect(CGRect) NSRange:是用来表示位置和范围的. 本质是: 1 typedef struct _NSRange

struct结构体详解

为什么要有结构体 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实际项目中,结构体是大量存在的.研发人员常使用结构体来封装一些属性来组成新的类型.由于C语言内部程序比较简单,研发人员通常使用结构体创造新的"属性",其目的是简化运算. 结构体在函数中的作用不是简便,其最主要的作用就是封装.封装的好处就是可以再次利用.让使用者不必关心这个是什么,只要根据定义使用就可以了. 在C语言中,可以定义结构体类型,将多个相

linux内核中的struct rlimit结构体详解

   在linux内核中,对一个进程获取系统资源的数量进行了限制.那么linux内核是如何实现这种对一个进程的各种资源的限制呢?    linux使用struct rlimit结构体来实现的,rlimit是 resource limit的缩写.    struct rlimit           {               unsigned int rlim_cur;  /* soft limit */               unsigned int rlim_max;  /* ha