windows网络编程技术001.pdf

上传人:asd****56 文档编号:70322346 上传时间:2023-01-19 格式:PDF 页数:44 大小:1.61MB
返回 下载 相关 举报
windows网络编程技术001.pdf_第1页
第1页 / 共44页
windows网络编程技术001.pdf_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《windows网络编程技术001.pdf》由会员分享,可在线阅读,更多相关《windows网络编程技术001.pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、下载本书第一部分讲述的是传统的网络接口 N e t B I O S、重定向器以及通过重定向器进行的各类网络通信。尽管本书大部分内容均围绕 Wi n s o c k编程这一主题展开,但是,A P I比起Wi n s o c k来,仍然具有某些独到之处。其中,第 1章探讨的是N e t B I O S接口,它和Wi n s o c k类似,也是一种与协议无关的网络A P I。N e t B I O S提供了异步调用,同时兼容于较老的操作系统,如 O S/2和D O S等等。第2章讨论了重定向器的问题,它是接下去的两个新主题邮槽(第3章)和命名管道(第4章)的基础。重定向器提供了与传输无关的文件输入

2、输出方式。邮槽是一种简单的接口,可在 Wi n d o w s机器之间实现广播和单向数据通信。最后,命名管道可建立一种双向信道,这种信道提供了对Wi n d o w s安全通信的支持。第1章 NetBIOS“网络基本输入输出系统”(Network Basic Input/Output System,NetBIOS)是一种标准的应用程序编程接口(A P I),1 9 8 3年由S y t e k公司专为I B M开发成功。N e t B I O S为网络通信定义了一种编程接口,但却没有详细定义物理性的“帧”如何在网上传输。1 9 8 5年,I B M创制了N e t B I O S扩展用户接口(

3、NetBIOS Extended User Interface,NetBEUI),它同N e t B I O S接口集成在一起,终于构成了一套完整的协议。由于 N e t B I O S接口变得愈来愈流行,所以各大厂商也开始在其他如T C P/I P和I P X/S P X的协议上实施N e t B I O S编程接口。到目前为止,全球已有许多平台和应用程序需要依赖于N e t B I O S,其中包括Windows NT、Windows 2000、Windows 95和Windows 98的许多组件。注意Windows CE并不支持NetBIOS API,只是用TCP/IP作为其传送协议,并

4、同时支持NetBIOS的名字与名字解析。Win32 NetBIOS接口向后兼容于早期的应用程序。本章要讨论的是 N e t B I O S编程基础。首先向大家介绍的是N e t B I O S的一些基本知识,从N e t B I O S的名字及L A N A编号开始,接着,我们围绕N e t B I O S提供的基本服务展开讨论,比如面向会话和“无连接”通信等等。在每一节,都展示了一个简单的客户机和服务器示例。在本章最后,我们陈列了程序员需留意的一系列陷阱以及易犯的错误。在本书的附录 A中,大家可找到一份命令索引,其中对每个 N e t B I O S命令都进行了总结,包括必要的参数,以及对其

5、行为的简单说明。OSI 网络模型“开放系统互连”(O S I)模型从一个很高的层次对网络系统进行了描述。O S I模型总共包含了七层。从最顶部的“应用层”开始,一直到最底部的“物理层”,这七个层完整阐述了最基本的网络概念。图1-1展示的正是O S I模型的样子。第一部分传统网络API图1-1 OSI网络模型对应O S I模型,N e t B I O S主要在会话和传输层发挥作用。1.1 Microsoft NetBIOS如前所述,NetBIOS API实施方案适用于为数众多的网络协议,使得编程接口“与协议无关”。换言之,假如根据 N e t B I O S规范设计了一个应用程序,它就能在 T

6、C P/I P、N e t B I O S甚至I P X/S P X上运行。这是一项非常有用的特性,因为对一个设计得当的 N e t B I O S应用程序来说,它几乎能在任何机器上运行,无论机器连接的物理网络是什么。然而,我们也必须留意几个方面的问题。要想使两个 N e t B I O S应用(程序)通过网络进行正常通信,那么对它们各自运行的机器来说,至少必须安装一种两者通用的协议。举个例子来说,假定小张的机器只安装了T C P/I P,而小马的机器只安装了N e t B E U I,那么对小张机器上的N e t B I O S应用来说,便无法同小马机器上的应用进行通信。除此以外,只有部分协

7、议实施了 N e t B I O S接口。Microsoft TCP/IP和N e t B E U I在默认情况下已提供了一个 N e t B I O S接口;然而,I P X/S P X却并非如此。为此,微软专门提供了一个I P X/S P X版本,在其中实现了该接口。在设计网络时,这个问题必须注意。安装协议时,具有N e t B I O S能力的I P X/S P X协议通常会自动提醒你注意这方面的问题。例如,Windows 2000提供的协议本身就叫作“NWLink IPX/SPX/NetBIOS兼容传送协议”。而在Windows 95和Windows 98中,请留意I P X/S P

8、X协议属性对话框,其中有一个特殊的复选框,名为“希望在I P X/S P X上启用N e t B I O S”。另外要注意的一个重要问题是 N e t B E U I并非是一种“可路由”协议。假定在客户机和服务器之间存在一个路由器,那么这种协议在两部机器上的应用便无法沟通。收到数据包后,路由器便会将其“无情地”地抛弃。T C P/I P和I P X/S P X则不同,它们均属“可路由”协议,不会出现这方面的问题。要注意的是,假如你需要在很大程度上依靠 N e t B I O S,那么在配置网络时,至少应安装一种可路由的传送协议。要想深入了解各种协议的特征以及相应的注意事项,请参阅第6章。1.1

9、.1 LANA编号从编程角度思考,大家或许会觉得奇怪,传送协议与 N e t B I O S如何对应起来呢?答案便在于L A N适配器(LAN adapter,LANA)编号,它是我们理解 N e t B I O S的关键。在最初的N e t B I O S实施方案中,每张物理网卡都会分配到一个独一无二的值:即L A N A编号。但到Wi n 3 2下,这种做法便显得有些问题。因为对一个工作站来说,它完全可能同时安装了多种网络协议,也可能安装了多张网卡。2计计第一部分附传统网络API下载应用层层描述为用户提供相应的界面,以便使用提供的连网功能完成数据的格式化控制两个主机间的通信链路(开放、操作

10、和关闭)提供数据传输服务(可靠或不可靠)在两个主机之间提供一套定址/寻址机制,同时负责数据包的路由选择控制两个主机间的物理通信链路:同时还要负责对数据进行整形,以便在物理媒体上传输物理媒体负责以一系列电子信号的形式,传出数据表示层会话层传输层网络层数据链路层物理层每个L A N A编号对应于网卡及传输协议的唯一组合。例如,假定某工作站安装了两张网卡,以及两种具有N e t B I O S能力的传输协议(如 T C P/I P和N e t B E U I),那么总共就有四个 L A N A编号。下面是一种对应关系的例子:0.T C P/I P网卡11.N e t B E U I网卡12.T C

11、P/I P网卡23.N e t B E U I网卡2通常,L A N A编号的范围在0到9之间,除LANA 0之外,操作系统并不按某种固定的顺序来分配这些编号。那么,LANA 0有什么特殊含义呢?LANA 0代表的是“默认”L A N A!N e t B I O S问世早期,许多应用都采用硬编码的形式,只依赖LANA 0进行工作。在那时,大多数操作系统也只支持一个L A N A编号。考虑到向后兼容的目的,我们可将LANA 0人工分配给一种特定的协议。在Windows 95和Windows 98中,通过选择控制面板中的“网络”图标,可访问一种网络协议的“属性”对话框。在“网络”对话框中选择“配置

12、”选项卡,再从网络组件列表中选择一种网络协议,按下“属性”按钮即可。对具有 N e t B I O S能力的每一种协议来说,其属性对话框的“高级”选项卡都有一个“设成默认的通信协议”复选框。若选中这个复选框,会重新安排协议的绑定,使默认协议能够分配到 LANA 0。注意在任何时候,只能有一种协议才能选中这个复选框。由于Windows 95和Windows 98具有所谓的“即插即用”功能,所以我们没有其他办法可对协议的编号顺序进行更改。Windows NT 4则允许用户在设置 N e t B I O S时拥有更大的灵活性。在“网络”对话框的“服务”选项卡中,可从“网络服务”列表框内选择 N e

13、t B I O S接口,然后点按“属性”按钮。随后便会出现“N e t B I O S配置”对话框,在这里可针对每一对网卡传输协议的组合,分配各自的L A N A编号。在这个对话框中,每张网卡都以其驱动程序的名字加以标识;但协议名称却显得有些暧昧。在图 1-2中,我们展示了N e t B I O S配置对话框的样子。单击其中的“E d i t”(编辑)按钮,便可为每种协议单独分配 L A N A编号。Windows 2000也允许我们单独分配L A N A编号。在控制面板中,双击“网络和拨号连接”图标。随后,从“高级”菜单中选择“高级设置”,然后在高级设置对话框中选择“L A N A编号”选项

14、卡。图1-2 NetBIOS配置对话框。这是一部多宿主机器,安装了两张网卡和三种传输协议:TCP/IP(NetBT)、NetBEUI(Nbf)以及IPX/SPX(NwlnkNb)第1章计NetBIOS计计3下载要想设计出一个“健壮”的 N e t B I O S应用,必然需要让自己的代码能对任意 L A N A编号上的连接进行控制。例如,假定小马编写了一个 N e t B I O S服务器应用,对LANA 2上的客户机进行监听。在小马的机器(即服务器)上,LANA 2正好对应于T C P/I P。后来,小张需要编写一个客户端应用,同小马的服务器通信,所以他决定让自己的程序通过工作站的 LANA

15、 2建立连接。然而,小张工作站上的 LANA 2对应于N e t B E U I。这样一来,两个应用相互间均无法通信尽管两者都安装了 T C P/I P和N e t B E U I。为纠正协议的这种差异,小马的服务器应用程序必须对小马工作站上每个可能的 L A N A编号上的客户机连接进行“监听”。类似地,小张的客户机应用程序需要针对本机每个可能的 L A N A编号,尝试在其上面的连接。只有这样,小马和小张才能保证自己的应用尽最大可能成功通信。当然,尽管我们需要在代码中对任何L A N A编号上的连接进行控制,但并不表示能够百分之百地成功。假如两台机器根本就没有安装一种共通的协议,那么无论如

16、何都是不能成功的!1.1.2 NetBIOS名字现在,我们知道了L A N A编号是什么,接着再来讨论 N e t B I O S名字(名称)的问题。对一个进程(或“应用”、“应用程序”)来说,它会注册自己希望与其通信的每个 L A N A编号。一个N e t B I O S名字长度为1 6个字符,其中第 1 6个字符是为特殊用途保留的。在名字表内添加一个名字时,应将名字缓冲区初始化成空白。在 Wi n 3 2环境中,针对每个可用的L A N A编号,每个进程都会为其维持一张 N e t B I O S名字表。若为LANA 0增添一个名字,意味着你的应用程序只能在LANA 0上同客户机建立连接

17、。对每个 L A N A来说,能够添加的名字的最大数量是 2 5 4,编号从1到2 5 4(0和2 5 5由系统保留)。然而,每种操作系统都设置了一个低于 2 5 4的最大默认值。重设每个L A N A编号时,我们可对此默认值进行修改。另外,N e t B I O S名字共有两种类型:唯一名字和组名。“唯一名字”意味着它是独一无二的:网络上不能再有其他任何进程来注册这个名字。如果一台机器已注册了某名字,那么在你注册该名字时,便会收到一条“重复名字”出错提示。大家或许已经知道,微软网络中的机器名采用的便是N e t B I O S名字。机器启动时,会将自己的名字注册到本地的“Wi n d o w

18、 s互联网命名服务器”(W I N S)。如果事前已有另一台机器注册了同样的名字,W I N S服务器便会报错。W I N S服务器维护着已注册的所有 N e t B I O S名字的一个列表。除此以外,随名字一道,还可保存协议特有的一些信息。比如在 T C P/I P网络中,W I N S同时维护着N e t B I O S名字以及注册那个名字的I P地址(亦即相应的机器)。假如配置网络时未为其分配一个W I N S服务器,那么如何检查名字是否重复呢?这时便要采用在整个网络内“发广播”的形式。当一名发送者向全网络发出一条特殊的广播消息时,如果没有其他机器回应这条消息,便允许发送者使用该名字。

19、而在另一方面,“组名”的作用是将数据同时发给多个接收者;或者相反,接收发给多个接收者的数据。组名并非一定要“独一无二”,它主要用于多播(多点发送)数据通信。在N e t B I O S名字中,第1 6个字符用于区分不同的微软网络服务。各种网络服务和组名需要用一个W I N S服务器完成注册。要么由配置了 W I N S功能的计算机进行名字的直接注册,要么由那些尚未配置W I N S功能的计算机,通过在本地子网内进行广播注册。N b t s t a t命令是一个非常有用的工具,可用它获取与本地(或远程)计算机上注册的N e t B I O S名字有关的信息。在表1-1展示的例子中,N b t s

20、 t a t-n命令可针对用户“D a v e m a c”,生成这个已注册的N e t B I O S名字的列表。D a v e m a c登录进入的那部计算机已被配置成一个主域控制器,而且运行的是4计计第一部分附传统网络API下载Windows NT Server操作系统,且已安装了I n t e r n e t信息服务器(I I S)。表1-1 NetBIOS名字表名字第1 6个字节名字类型服务D AV E M A C 1唯一工作站服务名D AV E M A C 1唯一服务器服务名D AV E M A C D成组域名D AV E M A C D成组域控制器名D AV E M A C D唯

21、一主控浏览器名D AV E M A C 1唯一发信者名I n e t S e r v i c e s成组I n t e r n e t信息服务器组名I S D AV E M A C 1唯一I n t e r n e t信息服务器唯一名D AV E M A C 1+唯一网络监视器名字只有在安装了T C P/I P协议的前提下,才会安装 N b t s t a t命令。该工具亦可用来查询远程机器的名字表,方法是在远程机器的名字后面,接上一个-a参数;或在远程机器的I P地址后,接上一个-A参数。在表1-2中,我们总结了各种不同的 M i c r o s o f t网络服务为唯一N e t B I

22、O S计算机名追加的默认第1 6个字节值。表1-2 唯一名字标识符第1 6个字节含义工作站服务名。通常,它对应于N e t B I O S计算机名收发消息时采用的信使服务名。W I N S服务器会将这个名字注册成W I N S客户机上的信使服务,并通常追加到计算机名后面,以及当前登录到计算机的用户名的后面域主控浏览器名。这个名字用于标识主域控制器,并指出用什么客户机和其他浏览器同域主控浏览器取得联系远程访问服务(R A S)服务器服务网络动态数据交换(N e t D D E)服务用于为文件共享提供“共享点”的服务器服务名R A S客户机网络监视器代理网络监视器工具表1-3则列出了在常用的一系列

23、N e t B I O S组名后,追加的默认第1 6个字节字符。如此多的标识符很易使人产生混淆,很难真正记住。所以,请考虑把它作为一个“速查表”或“索引”使用。大家或许不应在自己的 N e t B I O S名字中使用它们。为防止偶然同你的N e t B I O S名字发生冲突,最好避免使用唯一名字标识符。对于组名,恐怕更要引起高度注意假如你的名字同一个已有的组名相同,那么不会产生任何错误提示。若发生这种情况,结果就是会收到原本发给其他人的数据。表1-3 组名标识符第1 6个字节含义一个域组名,在这个组内包含了已注册域名的一系列计算机的特定地址。由域控制器来注册这个名字。W I N S将它当作

24、一个域组看待:组内每个成员必须单独更新自己的名字。域组最多只能包容 2 5个名字。若复制的一个静态 1 C名字同另一个W I N S服务器上的某个动态1 C名字发生冲突,便会增加成员的一个“联合”,同时将记录标定为“静态”。假如记录是静态的,组内成员便不必定时刷新自己的 I P地址第1章计NetBIOS计计5下载(续)第1 6个字节含义指定一个主控浏览器的名字,客户机通过它访问主控浏览器。在一个子网上,只能有一个主控浏览器。W I N S服务器会对域名注册作出“正”(肯定)响应,但却不会将域名保存在自己的数据库中。假如一台计算机向 W I N S服务器送出一个域名查询,则W I N S服务器会

25、返回一个“负”(否定)响应。若送出域名查询的那台计算机已被配置成 h节点或m节点,便会随之广播那个查询,以解析出正确的名字。客户机解析名字的方法是由节点的类型决定的。如客户机配置成 b节点解析,便会送出广播包,以便广告并解析出 N e t B I O S名字。p节点解析采用与W I N S服务器的点到点通信方式。而 m节点属于b及p节点的一种混合形式:首先使用的是 b节点;如有必要,再接着使用 p节点。最后一种解析方式是 h节点,亦称“混合模式”。它无论如何都会先尝试使用 p节点注册和解析,然后只有在解析失败的前提下,才会换用b节点。Wi n d o w s操作系统默认为h节点一个普通组名。浏

26、览器可向这个名字发送广播数据,并通过对它的监听来挑选一个主控浏览器。这些广播面向的是本地子网,绝对不应通过路由器传输一个I n t e r n e t组名。这种类型的名字由W I N S服务器进行注册,以便为了管理方面的目的来标定特定的计算机组。例如,“p r i n t e r s g”可以是一个注册的组名,用于标定由打印服务器构成的一个管理性组_ M S B R O W S E _不再是单独一个追加的第1 6位字符,“_ M S B R O W S E _”需要追加到一个域名后面,并在本地子网上进行广播,向其他主控浏览器通告这个新增的域1.1.3 NetBIOS特性N e t B I O

27、S同时提供了“面向连接”服务以及“无连接”服务。面向连接的服务,是指它允许两个客户机相互间建立一个会话,或者说建立一个“虚拟回路”。这种“会话”实际是一种双向的通信数据流,通信的每一方都可向另一方发送消息。面向连接的服务可担保在两个端点之间,任何数据都能准确无误地传送。在这种服务中,服务器通常将自己注册到一个已知的名字下。客户机会搜寻这个名字,以便建立与服务器的通信。就拿N e t B I O S的情况来说,服务器进程会针对想通过它建立通信的每一个 L A N A编号,将自己的名字加入与其对应的名字表。而对位于其他机器上的客户来说,就可将一个服务名解析成机器名,然后要求同服务器进程建立连接。大

28、家可以看到,为建立这种虚拟回路,必须采取一些适当的步骤。而且在初次建立连接的时候,还会牵涉到一些额外的开销。“面向连接”或“面向会话”的通信可保证通信具有极高的可靠性,而且数据包的收发顺序亦能确保正确无误。然而,它仍然是一种“以消息为基础”的服务。也就是说,假如已连接好的某个客户机执行一个“读”命令,那么服务器在流中仍然只会返回一个数据包尽管客户机此时提供了一个足够大的缓冲区,可同时容下几个包!“无连接”或数据报服务中,服务器并不将自己注册到一个特定的名下,而只是由客户机收集数据,然后将其送入网络,事前不必先建好任何连接(即无连接)。对于数据的目的地址,客户机会将其定义成服务器相应进程对应的

29、N e t B I O S名字。这种类型的服务不提供任何保障,但同面向连接的服务相比,却可有更好的性能,如在使用数据报服务(无连接服务)时,省下了建立连接所需的开销。例如,客户机可能向服务器兴冲冲地一下子发出数千字节的数据,但那台服务器早在一两天前便已当机了。除非依赖自服务器传来的响应,否则客户机永远都收不到任何错误提示(在这种情况下,假如在一个特定的时间段内,没有收到任何响应,便6计计第一部分附传统网络API下载可认为服务器出了故障)。数据报服务既不能保证数据传输的可靠性,也不能保证数据包的传送顺序正确无误。1.2 NetBIOS编程基础现在,我们已理解了 N e t B I O S的一些基

30、本概念,接下来要讨论的是 NetBIOS API的设置,这其实非常简单,因为只有一个函数:UCHAR Netbios(PNCB pNCB);用于 N e t B I O S的所有函数声明、常数等等均是在头文件N b 3 0.h内定义的。若想连接N e t B I O S应用,唯一需要的库是N e t a p i 3 2.l i b。该函数最重要的特征便是 p N C B这个参数,它对应于指向某个网络控制块(N C B)的一个指针。在那个 N C B结构中,包含了为执行一个N e t B I O S命令,相应的N e t b i o s函数需要用到的全部信息。该结构的定义如下:注意,并不是在对N

31、 e t B I O S的每次调用中都需要用到该结构内的全部成员;有些数据字段对应的是输出参数(换言之,自N e t b i o s调用返回之后才能设置)。在此提醒大家重要的一点:进行任何N e t b i o s调用之前,不要一开始就填写结构内的各个成员,而应先将这个 N C B结构清零!请看看表1-4的总结,其中解释了每个字段的用法。此外,本书附录 A的命令索引对每个N e t B I O S命令都进行了详尽总结,并解释了它需要用到NCB结构中的哪些字段,以及哪些字段可选。表1-4 NCB结构成员字段定义n c b _ c o m m a n d指定要执行的N e t B I O S命令。

32、许多命令都可同步或异步与A S Y N C H(0 X 8 0)标志以及命令进行按位O R(或)运算n c b _ r e t c o d e f指定操作的返回代码。在一个异步操作进行期间,函数会将该值设为N R C _ P E N D I N Gn c b _ l s n对应一个本地会话编号,与当前环境内的一次会话有着唯一对应的关系。成功执行了一次N C B C A L L或N C B L I S T E N命令后,函数会返回一个新的会话编号n c b _ n u m指定本地名字的编号。伴随N C B A D D N A M E或N C B A D D G R N A M E命令的每一次调用

33、,都会返回一个新编号。针对所有数据报命令,都必须使用一个有效的编号n c b _ b u ff e r指向数据缓冲区。对那些需要发送数据的命令,该缓冲区包含了要送出的实际数据;而对那些需要接收数据的命令,则包含了要从 N e t b i o s函数返回的数据。对其第1章计NetBIOS计计7下载(续)字段定义他命令来说,如N C B E N U M,缓冲区便是预定义的结构L A N A _ E N U Mn c b _ l e n g t h以字节数为单位,指定缓冲区的长度。对于接收命令来说,N e t b i o s会将该值设为收到的字节数。若指定的缓冲区不够大,N e t b i o s就

34、会返回N R C _ B U F L E N错误n c b _ c a l l n a m e指定远程应用的名字n c b _ n a m e指定应用程序已知的名字n c b _ r t o设定接收操作的超时期限。该值应设为 5 0 0毫秒的一个整数倍数。若为1,表示没有超时限制。该值是为 N C B C A L L和N C B L I S T E N命令设置的,它们会影响后续的N C B R E C V命令n c b _ s t o设定发送操作的超时期限。该值应设为 5 0 0毫秒的一个整数倍数。若为1,表示不存在超时限制。该值是为 N C B C A L L和N C B L I S T E

35、 N命令设置的,它们会影响后续的N C B S E N D和N C B C H A I N S E N D命令n c b _ p o s t指定异步命令完成后需要调用的后例程的地址。函数定义为:void CALLBACK PostRoutine(PNCB pncb);其中,p n c b指向已完成命令的网络控制块n c b _ l a n a _ n u m指定要在上面执行命令的L A N A编号n c b _ c m d _ c p l指定操作的返回代码。异步操作进行期间,Netbios会将这个值设为NRC_PENDINGn c b _ r e s e r v e保留;必须为0n c b _

36、 e v e n t指定设置为“未传信”(N o n s i g n a l e d)状态的一个Wi n d o w s事件对象的句柄。完成一个异步命令后,事件便会设置成它的“传信”(S i g n a l e d)状态。只应使用人工重设事件。假若n c b _ c o m m a n d未设置A S Y N C H标志,或者n c b _ p o s t不为0,那么该字段必须为0。否则,N e t b i o s会返回N R C _ I L L C M D错误同步与异步调用N e t b i o s函数时,可选择进行同步调用,还是进行异步调用。所有 N e t B I O S命令本身均是同步

37、的。换言之,完成命令以前,会一直调用 N e t b i o s块。而对一个N C B L I S T E N命令来说,当有一个客户机建立了连接,或发生某种类型的错误时,对 N e t b i o s的调用才会返回。要想异步调用一个命令,需要让 N e t B I O S命令同A S Y N C H标志进行一次逻辑O R(或)运算。如指定了A S Y N C H标志,那么必须在n c b _ p o s t字段中指定一个后例程(Post Routine),或必须在n c b _e v e n t字段中指定一个事件句柄。执行一个异步命令时,从 N e t b i o s返回的值是N R C _

38、G O O D R E T(0 x 0 0),但n c b _ c m d _ c p l t字段会设为N R C _ P E N D I N G(0 x F F)。除此以外,N e t b i o s函数还会将N C B结构的n c b _ c m d _ c p l t字段设为N R C _ P E N D I N G(待决),直到命令完成为止。命令完成后,n c b _ c m d _ c p l t字段会设为该命令的返回值。N e t b i o s也会在完成后将n c b _ r e t c o d e字段设为命令的返回值。1.3 常规NetBIOS例程本节将讨论一个基本的N e t

39、 B I O S服务器应用程序。之所以首先拿服务器开刀,是由于服务器的设计决定了客户机的行为。由于大多数服务器都要求同时为多个客户提供服务,所以异步N e t B I O S模型是最适合的。展示这个服务器应用程序例子时,我们同时用到了异步回调(C a l l B a c k)例程以及事件模型。但在我们首先展示的源码中,必须实现大多数 N e t B I O S应用程序、都要用到的一些常规函数。程序清单 1-1取自文件N b c o m m o n.c,它可在本书配套光盘8计计第一部分附传统网络API下载的 E x a m p l e s C h a p t e r 0 1 C o m m o

40、n目录下找到。贯穿全书的示范代码都会用到来自本文件的一系列基本函数。程序清单1-1 常规N e t B I O S例程(N b c o m m o n.c)第1章计NetBIOS计计9下载10计计第一部分附传统网络API下载第1章计NetBIOS计计11下载12计计第一部分附传统网络API下载在N b c o m m o n.c中,出现的第一个常规例程是 L a n a E n u m。这是几乎所有N e t B I O S应用都会用到的一个最基本的例程。该函数可列举一个指定系统上可用的所有 L A N A编号。函数会将一个N C B结构初始化成0,将n c b _ c o m m a n d

41、字段设为N C B E N U M,为n c b _ b u ff e r字段分配一个L A N A _ E N U M结构,并将n c b _ l e n g t h字段设为L A N A _ E N U M结构的长度。在N C B结构正确初始化之后,为执行N C B E N U M命令,L a n a E n u m函数需要采取的唯一行动便是调用 N e t b i o s函数。如大家所见,一个 N e t B I O S命令的执行异常简单。对同步命令来说,自 N e t b i o s返回的值可告诉我们命令是否成功执行。注意常数 N R C _ G O O D R E T肯定意味着“成功

42、”。使用当前机器上可用的 L A N A编号数量,以及各个实际的 L A N A编号,一次成功的N e t B I O S调用会填充完善指定的L A N A _ E N U M结构。L A N A _ E N U M结构的定义如下:其中,l e n g t h成员指出本地机器共有多少个 L A N A编号。l a n a字段代表由实际的 L A N A编号构成的一个数组。而l e n g t h值指出l a n a数组内有多少个元素会被填充L A N A编号。接下去的一个函数是R e s e t A l l(全部重设)。同样,该函数会在所有 N e t B I O S应用中用到。对一个编写风格

43、良好的N e t B I O S程序来说,必须重设计划使用的每个 L A N A编号。一旦拥有一个L A N A _ E N U M结构,并有来自L a n a E n u m的L A N A编号,便可针对结构中的每个L A N A编号,调用N C B R E S E T命令来重设它们。这正是 R e s e t A l l要帮我们达到的目的;函数的第一个参数是L A N A _ E N U M结构。重设只要求函数将n c b _ c o m m a n d设为N C B R E S E T,并将n c b _ l a n a _ n u m设为它需要重设的L A N A。注意尽管某些平台(比

44、如 Windows 95)并不要求我们对打算使用的每个L A N A编号进行重设,但最好还是那样做。Windows NT要求我们在正式使用前对每个L A N A编号进行重设;否则,对 N e t b i o s的其他调用就会返回错误代码5 2(亦即 N R C _E N V N O T D E F)。除此以外,重设一个 L A N A编号时,可通过 n c b _ c a l l n a m e的字符字段,设置特定的N e t B I O S环境参数。R e s e t A l l的其他参数与这些环境设定是对应的。函数用 u c M a x S e s s i o n参数来设置n c b _

45、c a l l n a m e的字符0,它用于指定可同时进行的最大会话数量。通常,操作系统会强第1章计NetBIOS计计13下载制使用一个比最大值小的默认值。举个例子来说,Windows NT 4的最大默认值为6 4个并发会话。R e s e t A l l将n c b _ c a l l n a m e的字符2(用于指定可为每个L A N A增加的最大N e t B I O S名字数量)设为u c M a x N a m e参数的值。同样,操作系统也会强加一个默认的最大值。最后,R e s e t A l l会将字符3(用于N e t B I O S客户机)设为它的 b F i r s t

46、N a m e参数的值。通过将此参数设为 T R U E,一个客户机便能将机器名作为自己的 N e t B I O S进程名使用。因此,那个客户机可与一个服务器建立连接,并在不允许任何进入连接的前提下,向其发送数据。这一选项有效缩短了初始化时间。而假若将一个N e t B I O S名字加入本地名字表,那么必须为此付出相应的代价。要想将名字加入本地名字表,必须用到另一个常规函数:A d d N a m e。需要的参数就是想添加的名字,以及将其加到哪个 L A N A编号。请记住,每个 L A N A编号永远对应一个名字表。如果你的应用程序需要与每个可用的 L A N A通信,便需为每个L A

47、N A增加进程名。用于增加一个唯一名字的命令是 N C B A D D N A M E。必须使用的其他字段包括要为其增加名字的那个L A N A编号,以及要实际增加的名字,后者必须复制到n c b _ n a m e中。A d d N a m e首先会将n c b _ n a m e缓冲区初始化成空白,然后假定 n a m e参数指向一个空中止字串。成功添加一个名字后,N e t b i o s会在n c b _ n u m字段中,返回同新增名字对应的 N e t B I O S名字编号。可随数据报一起使用该值,以标定始发的 N e t B I O S进程。有关数据报更深入的情况,我们会在本章

48、的后面进行详细讨论。增加一个独一无二的名字时,经常遇到的一个错误是 N R C _ D U P N A M E。若网络中的另一个进程已使用了要增加的名字,便会出现此类错误。A d d G r o u p N a m e的工作原理同A d d N a m e大致相同,只是它执行的命令是N C B A D D G R N A M E,而且永远不会出现什么N R C _ D U P N A M E错误。D e l N a m e是另一个有紧密联系的函数,用于从名字表中删除一个 N e t B I O S名字。它只要求指定打算删除的名字,以及从哪个 L A N A编号上删除那个名字。在程序清单1-1中

49、,接下去的两个函数是 S e n d和R e c v,用于在一个已经建立的会话中,进行数据的收发。这两个函数在工作方式上几乎完全相同,除了 n c b _ c o m m a n d字段的设置以外。这个命令字段可设为N C B S E N D或N C B R E C V。当然,用于收发数据的 L A N A编号以及相应的会话编号也是必需的参数。若成功执行了一个 N C B C A L L或N C B L I S T E N命令,便会返回相应的会话编号。客户机利用N C B C A L L命令同一个已知的服务建立连接;而服务器使用N C B L I S T E N“等候”进入的客户机连接。若两个

50、命令中有一个成功,N e t B I O S接口便会建立一个会话,并为其赋予独一无二的整数标识符。S e n d和R e c v还需要用到映射到 n c b _ b u ff e r和n c b _ l e n g t h的参数。发送数据时,n c b _ b u ff e r指向那个包含了要送出的数据的缓冲区。在长度(l e n g t h)字段中,指定了缓冲区中应当送出的字符数量。而在接收数据时,缓冲区(b u ff e r)字段指向在向其中复制数据的一个内存块。而长度字段指定了该内存块的大小。N e t b i o s函数返回之后,它会用成功接收到的字节数来更新长度字段。在一个面向会话的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁