对之前网络基础编程用到控制块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)的更多相关文章

  1. NetBios 的结构体详解

    [NetBios 的结构体详解] NetBIOS是早期的局域网传输协议. 1.结构体. 2.命令 NetBIOS命令的使用方式有两种,即等待和非等待(或称为同步与异步)方式. 如果命令码的高阶位是0时 ...

  2. struct net_device网络设备结构体详解

    转自:http://blog.csdn.net/viewsky11/article/details/53046787 在linux中使用struct net_device结构体来描述每一个网络设备.同 ...

  3. struct socket结构体详解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://weiguozhihui.blog.51cto.com/3060615/15852 ...

  4. CEF CefSettings 结构体 详解

    1. single_process: 设置为ture时,browser和render使用同一个进程.Chromium 不正是支持此运行模式,并且不如默认的多进程稳定. 2. no_sandbox: 沙 ...

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

    摘自:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/ 最近在看Linux下文件操作相关章节,遇到了这 ...

  6. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

    Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...

  7. Linux下DIR,dirent,stat等结构体详解(转)

    最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅. 首先说说DIR这一结构体,以下为DIR结构体的定义: struct __dirstre ...

  8. I2C初始化结构体详解

    typedef struct { uint32_t I2C_ClockSpeed; /*设置SCL时钟频,此值不低于40000*/ uint16_t I2C_Mode; /* 指定工作模式,可选I2C ...

  9. 【转】定时器、sigevent结构体详解

    原文网址:http://blog.163.com/zheng_he_xiang/blog/static/18650532620116311020390/ 最强大的定时器接口来自POSIX时钟系列,其创 ...

随机推荐

  1. LEETCODE —— Single Number

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  2. java实现定时任务的三种方法

    /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现,代码如下: * @au ...

  3. linux下Nginx 安装配置

    Nginx 安装 一.首先要安装 PCRE PCRE 作用是让 Ngnix 支持 Rewrite 功能. 1.下载 PCRE 安装包,下载地址: http://downloads.sourceforg ...

  4. How to Failover the ‘Cluster Group’

    If you have more than two nodes in the cluster, you can specify the destination node with the follow ...

  5. (C#) Tasks 中的异常处理(Exception Handling.)

    多线程编程中要注意对线程异常的处理.首先写个例子. 一个线程用于显示信息(Show Messages).主线程用于做其他工作(Do Works). using (Task taskShowMessag ...

  6. node_nibbler:自定义Base32/base64 encode/decode库

    https://github.com/mattrobenolt/node_nibbler 可以将本源码复制到自己需要的JS文件中,比如下面这个文件,一个基于BASE64加密请求参数的REST工具: [ ...

  7. RMAN_学习笔记5_RMAN Catalog Script恢复目录脚本

    2014-12-24 Created By BaoXinjian

  8. Centos6.4 用rpm方式安装MySql5.6

    1.查看系统是否安装了MySQL     使用命令:     #rpm -qa | grep mysql    2.卸载已安装的MySQL      卸载mysql命令如下:       #rpm - ...

  9. ArcGIS 10.1 中的style和serverstyle及制作方法

    图层的符号都是随机的,动态变化的,所以不利于图层的美观.还有一点就是符号有增加电子地图可读性的功能. Desktop的符号文件 把要用的符号用desktop的style manage制作相应符号,并把 ...

  10. Linux 使用 su 切换用户提示 Authentication Failure 的解决方法

    Ubuntu v14.04,使用 su 命令切换用户时报验证失败的错误 这个问题产生的原因是由于 ubuntu 系统默认是没有激活 root 用户的,需要我们手工进行操作,在命令行界面下,或者在终端中 ...