Windows+网络编程技术(十)Windows_网络编程技术(十)_.pdf
《Windows+网络编程技术(十)Windows_网络编程技术(十)_.pdf》由会员分享,可在线阅读,更多相关《Windows+网络编程技术(十)Windows_网络编程技术(十)_.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第10章 名字注册和解析本章,我们将全面论述Winsock 2中引入的名字注册和解析模型,它们都是与协议无关的。由于现在已经废弃了Winsock 1中引入的名字注册和解析方法,所以我们将不再对它进行讨论。首先,介绍名字注册和解析的重要性及其用法的背景知识,然后步步深入现有的各种不同的名字注册模型,最后说明 Winsock 2中用于解析名字的函数。另外,还谈谈如何注册自己的服务,以供他人查询。10.1 背景知识名字注册是一个过程,把一个用户好用的名和具体协议地址关联在一起。主机名及其I P地址便是例证。人们发现要记住一个工作站的地址(比如 1 5 7.5 4.1 8 5.1 8 6)非常麻烦
2、。所以他们宁愿把自己的机器命名为一个更容易记的地址,比如“a j o n e s 1”。在I P中,一项名为“域名命名系统”(D N S)会把I P地址映射成相应的名字。我们将在下一节详细地讨论名字空间。人们不仅希望能够注册和解析主机名,还希望能够映射自己的 Wi n s o c k服务器地址,以便于在客户机打算和服务器连接时,可获得服务器的地址。比方说,你有一个服务器,它运行的机器地址为1 5 7.6 4.1 8 5.1 8 6,端口为5 0 0 0。如果它只在那台机器上运行,就可以把这台服务器的地址硬编码到客户机应用程序中。但如果你需要一个更为动态的方法,即在若干台机器运行的服务器时,就要
3、考虑采用一个容错的分布式应用程序。如果一个服务器崩溃或过于繁忙,另一个应用就开始接替它,为客户机提供服务。这种情况下,要找到服务器事实上在哪个地址运行,是非常令人头疼的。最理想的情况是用若干个地址来注册自己的服务器命名为“容错分布式服务器”。另外,大家也许还希望动态更新一个已注册的服务及其地址。这便是名字注册和解析的核心,而本章将着重讨论 Wi n s o c k提供的一些适用于分布式服务器注册和名字解析的设计。10.2 名字空间模型深入Wi n s o c k函数之前,需要为大家讲讲大多数协议附带的各种名字空间模型。名字空间提供了一种能力,用一个友好名把具体的协议及其定址属性关联在一起。最常
4、见的名字空间是针对I P的D N S和N o v e l l针对I P X开发的N e t Wa r e目录服务(N D S)。这些名字空间在组成和实施各不相同,但它们的有些属性特别有助于我们理解如何通过 Wi n s o c k注册和解析名字。名字空间有三种类型:动态的、静态的和固定的。动态名字空间允许人们即时注册服务。另外,还意味着客户机可以在运行时对这个服务进行查看。一般说来,动态名字空间依赖于周期性地广播服务信息,表示该服务可继续使用。动态命名空间有:“服务声明协议”(S A P)(用于N e t Wa r e环境)和A p p l e Ta l k的“名字绑定协议”(N B P)名字
5、空间。这三类名字空间中,静态名字空间的灵活性最小。在静态名字空间内注册一个服务,需要在规定时间内进行手工注册。这意味着无法通过 Wi n s o c k用静态名字空间注册一个服务名,因为它只有一种解析法。D N S是一个静态名字空间。举个例子来说,你可以用 D N S手工把I P地址和主机名输入一个文件,D N S服务利用这个文件来处理解析请求。固定名字空间和动态名字空间一样,允许即时注册服务。但和动态名字空间不同的是,固定名字空间把注册信息保留在固定的地方上,比如说磁盘上的一个文件中。只有在服务请求被删除时,固定名字空间才会把这项服务条目删除。它的优点在于灵活,不会连续不断地广播任何一种类型
6、的有用信息。缺点就是如果一个服务行为不佳(或者说编得糟糕),该服务便在不通知名字空间提供者删除其服务条目的情况下,不知所终。从而导致客户机错误地认为该服务仍然可用。N D S是一个固定名字空间。名字空间的列举现在,大家已经知道名字空间的各种属性,但一台机器上可用哪些名字空间呢?我们来看看。多数预先定义的名字空间的声明都在 N s p a p i.h头文件中。每个名字空间都有一个分配所得的整数值。表1 0-1列出了一些比较常见的名字空间,它们已获支持,并可用于 Wi n 3 2平台。返回的名字空间由工作站上安装的协议决定。比方说,如果一个工作站上没有安装 I P X/S P X,就不会返回N S
7、 _ S A P名字空间。表10-1 已获支持的名字空间名字空间值说明N S _ S A P1S A P名字空间;用于I P X网络N S _ N D S2N D S名字空间;也用于I P X网络N S _ D N S11D N S名字空间;多见于T C P/I P网络和互联网N D _ N T D S3 2Windows NT域名空间;运行于Windows 2000的与协议无关的命名空间在一台机器上安装I P X/S P X时,只支持S A P名字空间查询。如果想注册自己的服务,还需要安装“S A P代理服务”。某些情况下,需要“N e t Wa r e的客户机服务”(Client Serv
8、ice ofN e t Wa r e)把本地的I P X接口地址准确无误地显示出来。如果没有这个服务,本地地址全部以 0的形式出现。另外还必须增加一个 N D S客户机,以便利用N D S名字空间。所有这些协议和服务都可通过“控制面板”得以增添。Winsock 2提供了一种方法,即如何通过程序获得一份列表,表上列出系统上所有可用的名字空间。这是通过调用W S A E n u m N a m e S p a c e P r o v i d e r s函数来完成的。该函数的定义如下:第一个参数作为l p n s p B u ff e r提交的缓冲区的长度,它是由多个 W S A N A M E S
9、 PA C E _ I N F O结构组成的一个大型数组。如果该函数是通过一个不充裕的缓冲区调用的,就会失败,把l p d w B u ff e r L e n g t h设为所需要的最小长度,则会导致 W S A G e t L a s t E r r o r返回W S A E FA U LT错误。这个函数将返回的 W S A N A M E S PA C E _ I N F O结构数的多少返回,或在错误之后出现S O C K E T _ E R R O R。W S A N A M E S PA C E _ I N F O结构描述指定机器上安装的一个独立名字空间。它的格式如下:244计计第二
10、部分附Winsock API下载事实上,这个结构有两种格式U n i c o d e和A N S I。Winsock 2头文件针对具体需要,灵活地定义了为W S A N A M E S PA C E _ I N F O的相应结构。实际应用中,所有结构和 Winsock 2注册和名字解析函数都有两个版本:U n i c o d e和A N S I。该结构的第一个成员N S P r o v i d e r I d,是一个通用的唯一识别符(G U I D),它对这个特殊的名字空间进行描述。d W N a m e S p a c e字段是这个名字空间的整数常量,比如 N S _ D N S或N S _
11、 N A P。f A c t i v e成员是一个布尔值,若是真,就表明该名字空间可用,并准备发出请求;反之则表示提供者未激活,不能发出特别引用提供者的请求。d w Ve r s i o n字段只对这个提供者的版本进行识别。最后,l p s z I d e n t i f i e r是该提供者的一个描述性的字串识别符。10.3 服务的注册下一步便是如何设置自己的服务,并使其有用,让网络上的其他机器都知道它。这就是利用名字空间提供者注册一个服务,这样一来,打算与之通信的客户机就可以对它进行声明或请求。注册一个服务实际上只有两步。第一步是安装一个描述服务特征的 service class(服务类)
12、。弄清楚服务类和事实上的服务本身之间的区别非常重要的。服务类和服务对两个不相同的概念。比方说,服务类描述哪些名字空间可用来注册自己的服务,该服务的特征有哪些(它是面向连接的,还是无连接的)。至于客户机如何才能建立一个连接,该服务类是无法将其描述出来的。服务类一旦注册,便可注册事实上的服务了,事实上的服务引用的是它所属的那个准确的服务类。一旦发生这种情况,客户机就可执行请求,在服务实例运行的地方进行查找,从而与别的机器通信。10.3.1 安装服务类在注册一个服务实例时,需要定义你的服务属于哪个服务类。用哪个名字空间注册这个服务类中的服务,由服务类定义决定。注册服务类的 Wi n s o c k函
13、数是W S A I n s t a l l S e r v i c e C l a s s,它的定义如下:唯一的参数是l p S e r v i c e C l a s s I n f o,它指向一个W S A S E RV I C E C L A S S I N F O结构,这个结构定义了这个服务类的属性。它的格式如下:第一个字段是G U I D,它对这个特殊的服务类进行唯一性识别。要在这里使用 G U I D,有两种方法可生成它。一是利用公用程序 U u i d g e n.e x e,并为这个服务器类建立一个 G U I D。采用这种方法的问题就是:如果需要再次引用这个 G U I D,
14、就必须把它的值硬编码到头文件中的第10章计名字注册和解析计计245下载某个地方。鉴于这一不便,第二种方法应运而生。在头文件 S v c g u i d.h内,有几个宏可生成基于一个简单属性的G U I D。比方说,如果你安装S A P服务类(将声明你的I P X应用程序),就可用S V C I D _ N E T WA R E宏。唯一的参数便是你为自己的应用程序类分配的 SAP ID编号。S A PI D编号是在N e t Wa r e中预先定义好的,比如说,0 x 4表示文件服务器,而0 x 7则表示打印服务器。若采用后一种方法,只需一个易于记忆的 SAP ID,利用它生成指定服务类的G U
15、 I D。另外,有几个宏把端口号当作一个参数来接收,并返回相应服务的G U I D。现在来看看头文件S v c g u i d e.h,其中包含一些针对逆向操作的宏,这些宏都是有用的从G U I D中取出服务端口号。G U I D是利用宏通过诸如端口号或SAP ID之类的属性生成的,表1 0-2列出了其中最常用的几个宏。头文件中还包括了一些众所周知的端口号(为 F T P和Te l n e t之类的服务预留的)的常量。表10-2 常用的服务I D宏宏说明S V C I D _ T C P(P o r t)通过T C P端口号生成一个G U I DS V C I D _ D N S(R e c
16、o r d Ty p e)通过一个D N S记录类型生成一个G U I DS V C I D _ U D P(P o r t)通过U D P端口号生成一个G U I DS V C I D _ N E T WA R E(S a p I d)通过SAP ID编口号生成一个G U I DW S A S E RV I C E C L A S S I N F O结构的第二个字段是l p s z S e r v i c e C l a s s N a m e,它仅仅是这个特定服务类的一个字串名。最后两个字段是描述性的:d w C o u n t字段引用一个数值,表示投递给l p C l a s s I n
17、 f o s字段的W S A N S C L A S S I N F O结构有多少,这些结构对事实上服务所用的名字空间和协议特征进行定义。事实上的服务是指在这个服务类下注册的服务。它的格式如下:l p s z N a m e字段定义服务类处理属性。表 1 0-3列出了可用的各种属性。其中每个属性都有一个R E G _ D W O R D类的值。表10-3 服务类型字串值定义的常量名字空间说明“S a p I d”S E RV I C E _ T Y P E _ VA L U E _ S A P I DN S _ S A PSAP ID“C o n n e c t i o n O r i e n
18、 t e d”S E RV I C E _ T Y P E _ VA L U E _ C O N N任何一种指明服务是面向连接的,还是无连接的“Tc p P o r t”S E RV I C E _ T Y P E _ VA L U E _ T C P P O RTN S _ D N ST C P端口N S _ N T D S“U d p P o r t”S E RV I C E _ T Y P E _ VA L U E _ U D P P O RTN S _ D N SU D P端口N S _ N T D Sd w N a m e S p a c e是这个属性所用的名字空间。表 1 0-3列
19、出了各种服务类型通常使用的名字空间。后三个字段d w Va l u e Ty p e、d w Va l u e S i z e和l p Va l u e,都对真正与服务类型关联的那个值进行了描述。d w Va l u e Ty p e字段标识与这个条目关联的数据的类型,所以称之为注册类型值。比如,这个值如果是D W O R D,其类型就应该是R E G _ D W O R D。下一个字段d w Va l u e S i z e,仅246计计第二部分附Winsock API下载仅是被当作l p Va l u e投递的数据之长度,l p Va l u e是一个数据指针。至于如何安装一个名为“Wid
20、get Server Class”的服务类,下面的代码示例对此进行了解释:首先要注意的是,这段代码采用了一个 G U I D,上面的服务类将在这个 G U I D下注册。你设计的服务都属于Widget Server Class这个类,而这个服务类描述的则是常见的属性,这些属性又属于一个服务实例。这个示例中,我们选用 N e t WareSAP ID of 200来注册服务类。这样做第10章计名字注册和解析计计247下载只是为了方便。其实,应该用一个任意的 G U I D或基于U D P端口号的G U I D。另外,当客户机正在端口5 1 5 0上监听时,该服务可以使用U D P协议。下一个注意
21、点是W S A S E RV I C E C L A S S I N F O结构的d w C o u n t字段被设为4。这个示例中,将用S A P名字空间(N S _ S A P)和Windows NT 域名空间(N S _ N T D S)来注册服务类。其余需要注意的是:即使是在只用两个名字空间注册这个服务类,但这里却用了四个 W S A N S C L A S S I N F O结构。因为我们为每个名字空间都定义了两个属性,而每个属性都需要一个独立的W S A N S C L A S S I N F O结构。为每个名字空间定义了服务是否面向连接。这个示例中,名字空间是无连接的,因为我们把
22、 S E RV I C E _ T Y P E _ VA L U E _ C O N N的值设成了一个布尔值 0。我们还针对Windows NT域名空间,通过使用服务类型S E RV I C E _ T Y P E _ VA L U E _ U D P P O RT,设置了U D P端口号,这个服务一般在这个端口下运行。针对S A P名字空间,我们用服务类型S E RV I C E _T Y P E _ VA L U E _ S A P I D设置了自己的服务SAP ID。针对每一个W S A N S C L A S S I N F O条目,在设置服务类型和值长度时,还必须设置名字空间识别符,
23、服务类型将在应用于这一名字空间。表 1 0-3中包括服务类型所需的类型,这一示例中结果都是D W O R D。最后一步是简单调用 W S A I n s t a l l S e r v i c e C l a s s,并把它当作一个参数投给W S A S E RV I C E C L A S S I N F O结构。如果W S A I n s t a l l S e r v i c e C l a s s调用成功,就返回0;反之,则返回 S O C K E T _ E R R O R。如果 W S A S E RV I C E C L A S S I N F O 无效或排列有误,W S A G
24、 e t L a s t E r r o r就会返回W S A E I N C A L。如果这个服务类已经存在,W S A G e t L a s t E r r o r则返回W S A E A L R E A D Y。这种情况下,就可以调用W S A R e m o v e S e r v i c e C l a s s,删掉一个服务器类。它的声明如下:这个函数的唯一参数是指向G U I D的指针。这个G U I D就是定义具体服务类的G U I D。10.3.2 服务的注册服务类一旦安装(说明你的服务有哪些常见属性),就可以注册自己的服务实例,这样一来,远程机器上的其他客户机就可使用这一服
25、务了。注册一个服务实例的Wi n s o c k函数是W S A S e t S e r v i c e。第一个参数l p q s R e g I n f o,是指向W S A Q U E RY S E T结构的指针,该指针定义特定的服务。我们简要说明这个结构。e s s O p e r a t i o n参数指定即将发生的行为,比如注册或取消注册。表 1 0-4对这三个有效标志进行了说明。第三个参数d w C o n t r o l F l a g s,不是0就是S E RV I C E _ M U LT I P L E这个标志。如果要在具体的服务实例下注册若干个地址,用这个标志即可。比如,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 网络 编程 技术 Windows_
限制150内