立即注册 登录
搜客社区-搜客网 返回首页

gudandemayi的个人空间 http://www.soke163.com/?9278 [收藏] [复制] [分享] [RSS]

日志

NetBios通信程序设计基础

已有 1223 次阅读2012-3-15 17:22 |个人分类:学习过的| 程序设计, 通信, netbios

NetBios协议

  我们已经说过,NetBios提供了会话层服务,它按对应层能理解的特定协议同远程机器上对应层进行通信。因此,NetBios还指定了一系列协议命令和网络层协议,以允许两台远程机器进行通信。我们将这些协议的实现称为NetBios驱动程程序。NetBios驱动程序可以是能够按照指定的NetBios协议同另一远程NetBios驱动程序进行通信的任一程序,处理或设备驱动程序等。下面将要介绍,NetBios驱动程序还提供了NetBios接口。
NetBios协议由一系列协议命令组成,每一条协议命令都对应于要在网络上传送的一帧。如图所示,每一个NetBios帧都要封装在LLC帧中,而LLC帧又要封装在MAC帧中。每一条NetBios驱动程序命令都将导致驱动程序向一个或多个已知或未知的接收方NetBios驱动程序发出这样的一个或多个NetBios包。
 
  NetBios接口

  前面已介绍过,NetBios层提供的是会话层服务,其实现称为NetBios驱动程序。但是,如果只有这些驱动程序或NetBios层本身,并不能实现通信。若想实现通信,NetBios层的客户机应当访问NetBios提供的服务具体访问可经由程序设设计接口完成。

  NetBios提供了一系列标准的程序设计接口,应用程序可以利用这些接口在局域网间进行通信。大多数局域网软软件商(例如Microsoft,IBM和Novell)都提供具有这些接口的NetBios驱动程序。因为这些接口事实上已成了标准,所以,将基于NetBios的应用程序从一个局域网软件环境不加修改或稍加修改地移至另一个局域网软件环境中运行是可行的。再说一遍,支持这些接口是NetBios驱动程序的义务,由NetBios驱动程序负责将每一个NetBios接口调用转换成相应的一个或多个NetBios的协议包。

  下面按照它们所提供的服务分类介绍一下NetBios接口。说明一下,这里所说的实体是指,利用NetBios接口同其他实体(包括本身)进行通信的任何处理,或关联着NetBios名的任何处理。NetBios名是个16安节域,多余部分用空格(20H)填充。
 
  命令服务

  NetBios为在网络上增加、删除、查找已命名NetBios实体提供了相应的接口。任何NetBios实体都可通过NetBios Add Name(增加名)接口使自己同一个NetBios名关联起来,该名在整个网络中具有唯一性。比如说,注册进入网络的每一个用户通常都有一个唯一的NetBios名,以便彼此之间能够区分开来。同时,一个实体可以登记成一个组名的一部分,多个实体可以将它们自己同这个组名相关联。例如,某一公司财务科的所有会计可以共享一个组名(或称别名),如“ACCOUNTS”,其后,发往该组名的消息将同时发往所有会计。当然,每一个会计还可有一个唯一的名(如注册ID或用户ID),以便发送和接收其个人消息。
 
  会话服务

  NetBios为创建、破坏或使用设置在任二个NetBios实体之间的会话提供了一系列接口。若想使用会话管理工具,NetBios实体首先应当通过Add Name接口将自己同一个唯一名关联起来。在两个实体间设置了会话后,他们可以使用各自喜好的Send和Receive接口发送和接收数据缓冲区,缓冲区最大可达128KB-2字节=131070字节。大多数NetBios应用程序都利用这些服务来发送和接收数据包。
 
  数据表服务

  NetBios提供了一系列接口,来发送和接收称为数据表(datagram)的数据包。并不能保证数据表一定能成功地发送和接收,NetBios只是简单地尽其最大的能力发送和接收实体所提供的数据表。数据表最大可有64KB-1字节=65535字节长。可发送给一个实体,也可以广播方式了送给网络中所有实体。
 
  杂务服务

  为获取安装在结点上的网络适配器卡的状态和动态复位适配器提供了相应的接口,它还为取消实体先前发出的命令提供了相应的接口。
 
  NetBios程序设计

  前面根据OSI模型讨论了一般的网络规则以及NetBios提供的服务,还介绍了NetBios提供的网络应用程序可用来进行网络通信的大量接口(由NetBios驱动程序实现),这里,再介绍一下如何在Windows应用程序中使用这些接口。

  NetBios程序设计中最容易混淆的是,并不是每个NetBios接口都有一个API函数,取而代之的是,Windows只提供了一个函数(NETBIOSCALL),这个函数以一个数据结构作为输入,虽然数据结构中的字段是固定的,但程序设计人员可以通过一个特定字段? ? 称为命令字段? ? 的值,来表明想使用哪一个NetBios服务。下面列出数据结构中的诸字段,说明每一个字段的含义,并给出一个使用NETBIOSCALL的样本代码段,最后还要讨论一下NetBios命令的异步和同步执行。
 
  NetBios控制块

  NetBios控制块(NCB)是所有NetBios应用程序都要用来访问NetBios服务的一个程序设计结构,并且是唯一的一个。设备驱动程序也使用类似的结构。NetBios控制块的C结构如下:

typedef struct tagNCB {
BYTE ncb_command;
BYTE ncb_retcode;
BYTE ncb_lsn;
BYTE ncb_num;
DWORD ncb_buffer;
WORD ncb_length;
BYTE ncb_callName[16];
BYTE ncb_name[16];
BYTE ncb_rto;
BYTE ncb_sto;
BYTE ncb_post;
BYTE ncb_lana_num;
BYTE ncb_cmd_cplt;
BYTE ncb_reserved[14];
} NCB, * PNCB;

  下面介绍每一个字段的具体含义。
 
  ncb_command字段

  每一个发往NetBios的NCB都代表一项要执行的动作,具体执行哪项动作,由ncb_command字段的取值决定。NetBios命令的使用方式有两种,即同步和异步,同步命令将阻止提交处理的执行,直到该命令执行完毕。而异步命令由NetBios在内部排队,并不阻止执行。命令执行完后,最终的返回码存放在NCB结构的ncb_cmd_cplt字段中。
 
  ncb_retcode字段

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

  同远程应用程序处理建立了会话后,NetBios驱动程序将相应设置该字段(局部会话号)。在随后的通信中,若想同远程处理进行通信,本地处理只需在NCB结构中指明局部会话号,不再需要在ncb_callname字段中指定完整的远程处理逻辑名。

  单就一个适配器而言,工作站上和每一个处理一次至多能进行254个会话,只要指定相关的局部会话号,就能达到会话的目的。系统保留值0和255,不将它们作为局部会话号使用。
 
  ncb_num字段

  工作站上的每一个处理最多可向名表中加进254个逻辑名。成功地将一名加进局域网适配器的私有名表后,NetBios将置ncb_num字段值成该名在名表中的索引值(索引值称为名号),在以后的同远程处理进行的非连接式通信中,可使用这个名号。

  名号0和255亦为系统保留,适配器的物理地址总在名表第1项(例如Name_Number=1)中。
 
  ncb_buffer字段

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

  ncb_length字段指定的是,由ncb_buffer字段指定的缓冲区的长度。接收到一块数据时,NetBios将相应设置该字段。
 
  ncb_callname字段

  这是一个由应用程序设置的16字节字段,其值是远程处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。所有的字节均有用。在远程驱动程序连接正期待着接收连接呼叫的本地处理时,NetBios将填写该字段。因此,接收呼叫的处理能够找出远程呼叫方的名。
 
  ncb_name字段

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

最后一个字节 含义
20h 服务器名
00h 重定向名
03h 用户名
05h 转寄名
 
  ncb_rto字段

  在期望从一个或数个远程处理接收到一包时,应用程序可在ncb_rto(接收时间限制)字段中指定等待的最大时间。若超过了指定时间仍未接收到包,则NetBios驱动程序将在ncb_retcode字段中返回错误。
若ncb_rto字段值为00h,则表示阻止执行,直到本地处理接收到一包。
 
  ncb_sto字段

  ncb_sto(发送时间限制)字段类似于ncb_rto字段,但它指定的是等待NetBios连接式命令,Send,完成的时间。若超过了指定时间,则将返回错误。

  若ncb_sto字段值为00h,则表示不为发送操作指定时间限制。此时,命令将阻止执行,直到要么成功地发送了一包,要么NetBios层停止了重试。
 
  ncb_post字段

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

  ncb_lana_num字段

  因为一台工作站上可能有不止一个局域网网络适配器卡,所以,NCB中相应也有一个字段,用来指明应用程序想使用哪一个网络适配器。该字段称为LAN适配器号或LANA号,LANA号从0开始。

  在像Microsoft LAN Manager这样的网络软件环境中,可以同时装入多个传输驱动程序(例如,TCP/IP,NetBios或XNS),其中每一个驱动程序都提供了一个NetBios接口。另外,一台工作站可能有不止一个LAN适配器卡,此时,ncb_lana-number字段指定的是某一特定对,即应用程序想使用的传输驱动程序和LAN适配器卡。
 
  ncb_cmd_cplt字段

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

  若想使用Windows提供的NETBIOSCALL函数,则应当从类似于图所示的汇编语言代码段中调用该函数的关键是,在远程调用NETBIOSCALL之前,要先将NCB结构的地址进入寄存器对ES:BX。这同在MS-DOS环境下提交NCB不同。在MS-DOS环境下提交NCB,是通过调用INT 5C或INT 2A实现的。当然,NCB结构的地址也要送入ES:BX。

  弄清楚提交上去的NCB是如何导致一包或数包被送至网络,以及NetBios是如何适应OSI模型的,总是有益的。下表给出了各自利用NETBIOSCALL来发送和接收包的发送方和接收方。

发送方 接收方
BETBIOSCALL NETBIOSCALL
Windows Windows
Redirector Redirector
传输(如NetBios) 传输(如NetBios)
MAC(如Token Ring) MAC(如Token Ring)
 
  同步NetBios命令对异步NetBios命令

  所有的NetBios命令都可同步执行,并且大多数命令亦能异步执行。图示出了NetBios命令及其在NCB.H中定义的代码。
 
NetBios命令 描述 同步代码 异步代码
NCBRESET 复位 32h 不允许
NCBASTAT 适配器状态 33h B3h
NCBCANCEL 取消 35h 不允许
NCBUNLINK 取消链接 70h 不允许
NCBADDNAME 加入名称 30h B0h
NCBDELNAME 删除名称 31h Bih
NCBADDGRNAME 加入组名 36h B6h
NCBFINDNAME 寻找名称 78H F8H
NCBCALL 呼叫 10h 90h
NCBLISTEN 侦听 11h 91h
NCBHANGUP 挂起 12h 92h
NCBSEND 发送 14h 94h
NCBRECV 接收 15h 95h
NCBRECVANY 全部接收 16h 96h
NCBCHAINSEED 链发送 17h 97h
NCBCHAINSENDNA 链发送(无回应) 72h F2h
NCBSSTAT 状态 34h B4h
NCBDGSEND 发送数据 20h A0h
NCBDGRECV 接收数据 21h A1h
NCBDGSENDBC 发送广播 22h A2h
NCBDGRECVBC 接收广播 23h A3h

  提交了一条同步命令处理将不再执行,直到所提交的同步命令执行完毕。而提交了一条异步命令的处理在等待这条命令执行完毕的同时还可以继续执行其他任务。具体使用哪一种命令,主要取决于手头要执行的任务及应用程序的性质。但是,在使用同步命令时要小心,特别是在命令完成时间不可确定的情况下。若在这种情况下使用同步命令,则应用程序将挂起。这种情况的害处在基于MS-DOS的系统中尤其明显,因为此时在命令执行完毕前不能进行任何其他活动。而windows环境下,将阻止用户切换进其他应用程序。也就是说,如果使用不小心的话,同步命令将导致应用程序对用户不友好。下面讨论一下异步命令的提交方式。

  为了进行异步调用,NCB命令应当同80hsh相或。另外,在命令执行完毕之前,所提交的NCB不应当被破坏或释放。必要的话,可通过NCB结构的ncb_rto和ncb_sto字段指定适当的超时限制。NCB命令执行完毕或超时后,NetBios驱动程序将相应设置NCB结构的ncb_retcode和ncb_cplt字段。

  提交后,异步命令可能立即完成。在这种情况下,NetBios驱动程序将设置ncb_retcode和ncb_cmd_cplt字段,NetBios调用将立即返回。NCB提交后立即进行的NCB处理,如果发现了错误,则将采取相同的处理,ncb_retocode字段值即为返回码。如果上述情况都没有发生,则NetBios驱动程序将把所提交的NCB在内部队列中排队,等待以后执行,并在ncb_retcode和ncb_cmd_cplt字段中返回FFh。

  可通过两种途径等待步命令执行完毕。第一种是在提交NCB时将ncb_post字段值置成FFh。此时,应用程序可以轮询NCB是否已执行完,具体方法就是查看ncb_cmd_cplt字段的取值。命令完成(成功、失败或超时)后,NetBios驱动程序将把最终的返回码填写在ncb_cmd_cplt字段中,最终的返回码决不会是FFh。第二种途径是,在提交NCB之前,先将后处理例程的地址送入NCB结构的ncb_post字段。在这种情况下当命令完成(成功、失败或超时)时,NetBios将调用该例程。后处理例程是NetBios驱动程序在中断时要调用的应用程序的一部分,因此,在NCB处理完成之前,代码应当留在同样的内存单元中。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

文字版|小黑屋|搜客社区    

GMT+8, 2020-12-4 12:58 , Processed in 0.044572 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部