《Windows+网络编程技术(六)Windows_网络编程技术(六)_.pdf》由会员分享,可在线阅读,更多相关《Windows+网络编程技术(六)Windows_网络编程技术(六)_.pdf(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、下载第6章 地址家族和名字解析要通过Wi n s o c k建立通信,必须了解如何利用指定的协议为工作站定址。本章将一一说明Wi n s o c k支持的协议以及各协议如何把一个指定家族的地址解析成网络上一台具体的机器。Winsock 2引入了几个新的、与协议无关的函数,它们可和任何一个地址家族一起使用;但是大多数情况下,各协议家族都有自己的地址解析机制,要么通过一个函数,要么作为一个投给g e t s o c k o p t的选项。本章只讲解各协议组成地址结构时所需的一些基本知识。第 1 0章讨论注册和名字解析函数,这些函数对特定协议家族服务进行声明(这和简单的名字解析稍有不同)。关于直接名
2、字解析、服务声明与解析之间的差别,可参见第 1 0章。对已讲过的地址家族来说,我们将进一步探讨如何为网络上的一台机器定址。然后,再针对各个家族建立套接字。除此以外,还要讨论协议独有的名字解析选项。6.1 IP网际协议(Internet Protocol,IP)是一种用于互联网的网络协议,已经广为人知。它可广泛用于大多数计算机操作系统上,也可用于大多数局域网 L A N(比如办公室小型网络)和广域网WA N(比如说互联网)。从它的设计看来,I P是一个无连接的协议,不能保证数据投递万无一失。两个比它高级的协议(T C P和U D P)用于依赖I P协议的数据通信。6.1.1 TCP面向连接的通信
3、是通过“传输控制协议”(Transmission Control Protocol,TCP)来完成的。T C P提供两台计算机之间的可靠无错的数据传输。应用程序利用 T C P进行通信时,源和目标之间会建立一个虚拟连接。这个连接一旦建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。6.1.2 UDP无连接通信是通过“用户数据报协议”(User Datagram Protocol,UDP)来完成的。U D P不保障可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。简单地说,如果一个客户机向服务器发送数据,这一数据会立即发出,不管服务器是否已准备接收数据。如果服务器收到
4、了客户机的数据,它不会确认收到与否。数据传输方法采用的是数据报。T C P和U D P两者都利用 I P来进行数据传输,一般称为 T C P/I P和U D P/I P。Wi n s o c k通过A F _ I N E T地址家族为I P通信定址,这个地址家族的定义在 Winsock 1.h和Winsock 2.h中。6.1.3 定址I P中,计算机都分配有一个 I P地址,用一个3 2位数来表示,正式的称呼是“I P v 4地址”。客户机需要通过T C P或U D P和服务器通信时,必须指定服务器的 I P地址和服务端口号。另外,第6章计地址家族和名字解析计计103下载服务器打算监听接入客
5、户机请求时,也必须指定一个 I P地址和一个端口号。Wi n s o c k中,应用通过S O C K A D D R _ I N结构来指定I P地址和服务端口信息,该结构的格式如下:s i n _ f a m i l y字段必须设为A F _ I N E T,以告知Wi n s o c k我们此时正在使用I P地址家族。IP协议第6版I P协议第6版对原来的I P协议规格进行了改进,将 I P地址扩展到1 6个字节。随着I P v 4的退场,不久的将来,I P v 6的地位显得越来越重要。许多 Wi n s o c k头文件中都包含针对I P v 6结构的条件定义;但是当前的 Wi n 3
6、2平台均没有提供 I P v 6网络堆栈(包括 Wi n d o w s2 0 0 0在内)。“微软研究部”已开发出一个试验性的I P v 6堆栈,可从 h t t p:/r e s e a r c h.m i c r o s o f t.c o m/m s t r i p v 6/下载;然而,该堆栈未获支持,而且我们不打算深入第 6版协议中专有的特性。准备使用哪个T C P或U D P通信端口来标识服务器服务这一问题,则由 s i n _ p o r t字段定义。在选择端口时,应用必须特别小心,因为有些可用端口号是为“已知的”(即固定的)服务保留的(比如说文件传输协议和超文本传输协议,即 F
7、 T P和H T T P)。“已知的协议”,即固定协议,采用的端口由“互联网编号分配认证(I A N A)”控制和分配,RFC 1700中说明编号。从本质上说,端口号分为下面这三类:“已知”端口、已注册端口、动态和(或)私用端口。0 1 0 2 3由I A N A控制,是为固定服务保留的。1 0 2 4 4 9 1 5 1是I A N A列出来的、已注册的端口,供普通用户的普通用户进程或程序使用。4 9 1 5 2 6 5 5 3 5是动态和(或)私用端口。普通用户应用应该选择 1 0 2 4 4 9 1 5 1之间的已注册端口,从而避免端口号已被另一个应用或系统服务所用。此外,4 9 1 5
8、 2 6 5 5 3 5之间的端口可自由使用,因为 I A N A这些端口上没有注册服务。在使用bind API函数时,如果一个应用和主机上的另一个应用采用的端口号绑定在一起,系统就会返回Wi n s o c k错误W S A E A D D R I N U S E。第7章将深入阐述Wi n s o c k绑定进程。S O C K A D D R _ I N结构的s i n _ a d d r字段用于把一个I P地址保存为一个4字节的数,它是无符号长整数类型。根据这个字段的不同用法,还可表示一个本地或远程 I P地址。I P地址一般是用“互联网标准点分表示法”(像a.b.c.d一样)指定的,每
9、个字母代表一个字节数,从左到右分配一个 4字节的无符号长整数。最后一个字段sin_ zero,只充当填充项的职责,以使S O C K A D D R _ I N结构和S O C K A D D R结构的长度一样。一个有用的、名为 i n e t _ a d d r的支持函数,可把一个点式 I P地址转换成一个 3 2位的无符号长整数。它的定义如下:unsigned long inet_addr(const char FAR*cp);c p字段是一个空中止字符串,它认可点式表示法的 I P地址。注意,这个函数把I P地址当作一个按网络字节顺序排列的 3 2位无符号长整数返回(网络字节顺序在下面的
10、“字节排序”小节中简要说明)。1.特殊地址对于特定情况下的套接字行为,有两个特殊I P地址可对它们产生影响。特殊地址I N A D D R _ A N Y允许服务器应用监听主机计算机上面每个网络接口上的客户机活动。一般情况下,在该地址绑定套接字和本地接口时,网络应用才利用这个地址来监听连接。如果你有一个多址系统,这个地址就允许一个独立应用接受发自多个接口的回应。特殊地址I N A D D R _ B R O A D C A S T用于在一个I P网络中发送广播U D P数据报。要使用这个特殊地址,需要应用设置套接字选项 S O _ B R O A D C A S T。第9章将对该选项进行详细论
11、述。2.字节排序针对“大头”(b i g-e n d i a n)和“小头”(l i t t l e-e n d i a n)形式的编号,不同的计算机处理器的表示方法有所不同,这由各自的设计决定。比如,Intel 86处理器上,用“小头”形式来表示多字节编号:字节的排序是从最无意义的字节到最有意义的字节。在计算机中把I P地址和端口号指定成多字节数时,这个数就按“主机字节”(h o s t-b y t e)顺序来表示。但是,如果在网络上指定 I P地址和端口号,“互联网联网标准”指定多字节值必须用“大头”形式来表示(从最有意义的字节到最无意义的字节),一般称之为“网络字节”(n e t w o
12、 r k-b y t e)顺序。有一系列的函数可用于多字节数的转换,把它们从主机字节顺序转换成网络字节顺序,反之亦然。下面四个A P I函数便将一个数从主机字节顺序转换成网络字节顺序:h t o n l和W S A H t o n l的h o s t l o n g参数是按主机字节顺序的一个 4字节数。h t o n l函数返回的数顺序是网络字节顺序,而 W S A H t o n l函数通过l p n e t l o n g参数返回的数顺序是网络字节顺序。h t o n s和W S A H t o n s的h o s t s h o r t参数是按主机字节顺序的一个 2字节数。h t o n
13、 s函数把这个数当作按网络字节顺序的一个2字节值返回,而W S A H t o n s函数通过l p n e t s h o r t参数把这个数返回。下面这四个是前面四个函数的反向函数:它们把网络字节顺序转换成主机字节顺序:104计计第二部分附Winsock API下载现在,我们打算演示一下如何利用上面描述的i n e t _ a d d r和 h t o n s函数来创建S O C K A D D R _ I N结构。6.1.4 创建套接字创建一个I P套接字的好处是便于应用能够通过 T C P、U D P和I P协议进行通信。如要用 T C P协议打开一个 I P套接字,需调用带有地址家族
14、 A F _ I N E T和套接字类型 S O C K _ S T R E A M的s o c k e t函数或W S A S o c k e t函数,并把协议字段设成0,方式如下:要利用U D P协议打开 I P套接字,只须指定套接字类型,用这个指定的套接字类型代替s o c k e t函数中的S O C K _ S T R E A M和上面的W S A S o c k e t调用。还可以打开一个套接字通过 I P直接通信。这是把套接字类型设成 S O C K _ R AW来完成的。第1 3章将对S O C K _ R AW选项进行深入探讨。6.1.5 名字解析Wi n s o c k应用
15、打算通过I P和主机通信时,必须知道这个主机的 I P地址。依用户看来,I P地址是不容易记的。在指定机器时,许多人更愿意利用一个易记的、友好的主机名而不是I P地址。Wi n s o c k提供了两个支持函数,它们有助于用户把一个主机名解析成 I P地址。Wi n d o w s套接字g e t h o s t b y n a m e和WSAAsynGetHostByName API函数从主机数据库中取回与指定的主机名对应的主机信息。两个函数均返回一个 H O S T E N T结构,该结构的格式如下:第6章计地址家族和名字解析计计105下载h _ n a m e字段是正式的主机名。如果网络
16、采用了“域内命名系统”(D N S),它就是导致命名服务器返回响应的“全限定域名”(F Q D N)。如果网络使用一个本地“多主机”文件,主机名就是 I P地址之后的第一个条目。h _ a l i a s e s字段是一个由主机备用名组成的空中止数组。h _ a d d r t y p e表示即将返回的地址家族。h _ l e n g t h字段则对h _ a d d r _ l i s t字段中的每一个地址定义字节长度进行定义。h _ a d d r _ l i s t字段是一个由主机I P地址组成的空中止数组(可以为一个主机分配若干个I P地址)。这个数组中的每个地址都是按网络字节顺序返回
17、的。一般情况下,应用程序都采用该数组中的第一个地址。但是,如果返回的地址不止一个,应用程序就会相应地选择一个最恰当的,而不是一直都用第一个地址。gethostbyname API函数的定义如下:n a m e参数表示准备查找的那个主机的友好名。如果这个函数调用成功,系统就会返回一个指向H O S T E N T结构的指针。注意,保存 H O S T E N T结构的是系统内存。应用程序不应该依靠它来维护状态。由于该内存由系统维护,因此,你的应用程序不必释放这个已返回的结构。WSAAsyncGetHostByName API函数是g e t h o s t b y n a m e函数的异步版,后
18、一个函数在结束时,利用Wi n d o w s消息向应用程序发出通知。W S A A s y n G e t H o s t B y N a m e的定义如下:b W n d参数是窗口句柄,异步请求结束时,这个句柄将收到一条消息。w M s g参数是异步请求结束时收到的窗口消息。n a m e参数代表我们正在查找的主机之用户友好名。b u f参数是一个指针,它指向接收 H O S T E N T数据的那个数据域。这个缓冲区必须大于 H O S T E N T结构,应该设为M A X G E T H O S T S T R U C T中定义的最大长度。另外两个用于获得主机信息的函数是:g e t
19、 h o s t b y a d d r和WSAAsynGetHostByName API函数,它们是为获得与 I P网络地址相应的主机信息而设计的。在有了主机 I P地址,并打算查找其用户友好名时,这两个函数非常有用。g e t h o s t b y a d d r函数的定义如下:a d d r参数是指向一个I P地址的指针,这个地址按网络字节顺序排列。l e n参数用于指定a d d r参数的字节长度。t y p e 参数将指定 A F _ I N E T值,这个值表明指定类型是I P地址。WSAAsyncGetHostByAddr API函数是g e t h o s t b y a d
20、 d r函数的异步版。端口号106计计第二部分附Winsock API下载第6章计地址家族和名字解析计计107下载应用打算与运行于本地或远程计算机上的服务进行通信时,除了要知道远程计算机的I P地址外,还必须知道服务的端口号。在使用 T C P和U D P时,应用必须决定计划通过哪些端口进行通信。有几个“已知的端口号”是服务器服务保留的,这些服务支持比T C P高级的协议(比如T C P和S P X)。举个例子来说,端口 2 1是为F T P预留的,端口8 0是为F T T P预留的。正如前面提到的那样,已知的服务一般都采用 1 1 0 2 3之间的端口号来设置协议。如果你正在开发一个不使用任
21、何一种已知服务的 T C P应用,就要考虑采用 1 0 2 3以上的端口,以免重复。通过调用g e t s e r v b y n a m e和W S A A s y n c G e t S e r v B y N a m e函数,便可获得已知服务的端口号。这两个函数只从名为s e r v i c e s的文件中获得静态信息。Windows 95和Windows 98中,服务文件位于 W I N D O W S下面;在 Windows NT 和 Windows 2000中,则位于 W I N D O W S S y s t e m 3 2 D r i v e r s E t c下面。g e t
22、 s e r v b y n a m e函数的定义如下:n a m e参数代表准备查找的服务名。举个例子来说,如果你正在定位 F T P端口,就应该把n a m e参数设成指向字串“f t p”。p r o t o参数随便指向一个字串,这个字串表明 n a m e中的服务是在这个参数中的协议下面注册的。W S A A s y n c G e t S e r v B y N a m e函数是g e t s e r v b y n a m e函数的异步版。Windows 2000中有一个新的注册和请求 T C P及U D P服务信息的动态方法。服务器应用可利用W S A S e t S e r v
23、 i c e函数来注册服务名、I P地址和服务的端口号。客户机应用可利用这三个A P I函数的组合请求这条服务信息,这三个函数是W S A L o o k u p S e r v i c e B e g i n、W S A L o o k u p S e r v i c e N e x t和W S A L o o k u p S e r v i c e E n d。第1 0章将对此进行讨论。6.2 红外线套接字红外线套接字称为I r S o c k,它是一个令人兴奋不已的新技术,首先在Wi n d o w s平台上亮相。红外线套接字允许两台计算机通过红外线串行端口进行通信。目前,红外线套接字可
24、在Windows 98和Windows 2000上使用。红外线套接字不同于传统意义上针对便携机的短暂性而设计的套接字。它们展示了一种新的名字解析模型,下一小节中将对此进行讨论。6.2.1 定址由于带有“红外线数据联盟”(Infrared Data Association,IrDA)设备的大多数计算机可能经常性地拆卸,传统的名字解析方案不能满足人们的需求。传统解析方法充当命名服务器之类的静态资源人们在移动正在运行网络客户任务的手提式电脑或膝上型计算机时,是不能使用这些资源的。为解决这一问题,I r D A就设计成了这样:无须在整个大型网络上,只须用一种特定的方式浏览范围内的资源,因此,I r D
25、 A没有使用标准的Wi n s o c k命名服务函数和I P定址。相反,命名服务已并入通信流,另外还引入了一个新的地址家族,以支持与红外线串行端口绑定在一起的服务。I r S o c k地址结构中包含一个服务名(它对绑定和连接调用中所使用的应用进行描述)和一个设备标识符(描述运行服务的设备)。这里的服务名和设备标识符类似于传统T C P/I P套接字所用的I P地址和端口号字元组。I r S o c k地址结构的定义如下:i r d a A d d r e s s F a m i l y字段一直都是A F _ I R D A。i r d a D e v i c e I D是一个4字符的字串,
26、用于唯一性地标识特定服务所运行的设备。在建立 I r S o c k服务器时,这个字段是忽略不计的。但是对客户机而言,却非常重要,因为它指定的是准备连接的那个 I r D A设备(也可能有若干个)。最后,i r d a S e r v i c e N a m e字段是服务名,应用要么利用这项服务对其本身进行注册,要么试着与这项服务建立连接。6.2.2 名字解析定址可以利用“I r D A逻辑服务访问点选择符(L S A P-S E L)”或“信息访问服务”(I A S)注册的服务为基础。I A S从一个L S A P-S E L中摘出一项服务,并把它置入用户友好的文本服务名中,方式和互联网域名
27、服务器把名字映射到数字化 I P地址差不多。要成功建立一个连接,既可以用L S A P-S E L,又可以用用户友好名。不过,用户友好名需要名字解析。大多数时候,都不要使用直接的 L S A P-S E L“地址”,因为I r D A服务的地址空间是限制了的。Wi n 3 2实施方案允许L S A P-S E L整数标识符,标识符的范围是 1到1 2 7。从本质上说,我们可把 I A S服务器当作一个W I N S服务器,因为它把L S A P-S E L和一个文字化的服务名关联在一起。事实上的I A S条目有三个重要字段:类名、属性和属性值。举个例子来说,一个服务器希望在服务名M y S e
28、 r v e r下对其本身进行注册。这是服务器通过相应的 S O C K A D D R _ I R D A结构执行绑定调用时完成的。这种情况一旦发生,就会增加一个I A S条目,该条目中包括类名M y S e r v e r、属性I r D A:Ti n y T P:L s a p-S E L和属性值3。属性值就是下一个未用过的 L S A P-S E L,这个 L S A P-S E L是系统根据注册来分配的。另一方面,客户机向连接调用投递一个S O C K A D D R _ I R D A结构。随后便开始I A S查找,查找带有类名M y S e r v e r和属性I r D A:T
29、i n y T P:L s a p-S E L的那项服务。I A S查询会返回3这个值。用户可利用g e t s o c k e t o p t调用中的套接字选项I R L M P _ I A S _ Q U E RY来定制自己的I A S查询。如果打算完全忽略 I A S(一般不建议使用),则可为客户机准备连接的服务名或终端直接指定一个L A S P-S E L地址。忽略I A S后,就只能和不提供任何 I A S注册的老 I r D A设备(比如红外线打印机)进行通信。把 S O C K A D D R _ I R D A结构中的服务名指定为 L S A P-S E L-x x x,就可忽
30、略I A S注册和查找。其中,x x x处是属性值,其范围在 1到1 2 7之间。对服务器而言,这样会直接为该服务器分配特定的 L S A P-S E L地址(假定这个 L S A P-S E L地址尚未使用)。对客户机而言,这样会忽略I A S查找,并试图马上与运行于指定的 L S A P-S E L上的任何一项服务建立连接。6.2.3 红外线设备列举由于红外线设备的使用地点不固定,因此,必须有一种方法,可以动态地把特定范围内的所有可用红外线设备列举出来。我们先从Windows CE实施方案和Windows 98及Wi n d o w s2 0 0 0实施方案之间的几点差别谈起。Window
31、s CE先于其他平台支持I r S o c k,并提供少量与红外线设备有关的信息。后来,Windows 98和Windows 2000也开始支持I r S o c k,但它们新增了另外的“提示”信息,该信息是由列举请求返回的(关于提示信息,我们稍后将简要论述)。108计计第二部分附Winsock API下载这样一来,Windows CE的A F _ i r d a.h头文件中包含的是原始的、少量的结构定义;但是,其他平台提供的新的头文件中包含的则是目前支持 I r S o c k的各个平台的条件结构定义。为了保持一致,我们建议大家采用较新的A f _ i r d a.h头文件。列举临近红外线设
32、备的方法是采用g e t s o c k o p t的I R L M P _ E N U M _ D E V I C E命令。D E V I C E L I S T结构被当作o p t v a l参数投递。这里有两个结构,一个针对 Windows 98和Wi n d o w s2 0 0 0,另一个针对Windows CE。这两个结构的格式如下:Windows 98和Windows 2000结构与Windows CE结构之间的唯一区别是 Windows 98和Windows 2000结构中包含一个 W I N D O W S _ I R D A _ D E V I C E _ I N F O数
33、组,该数组与 W C E _I R D A _ D E V I C E _ I N F O结构的数组相对应。条件性的#d e f i n e指令根据目标平台,声明D E V I C E L I S T结构是正确的。同样,也有对I R D A _ D E V I C E _ I N F O结构的两个声明:#d e f i n e指令根据目标平台,向正确的结构定义声明 I R D A _ D E V I C E _ I N F O。正如前面提到的那样,真正用于列举红外线设备的函数是带有 I R L M P _ E N U M _ D E V I C E S选项的g e t s o c k o p
34、t函数。下面这一段代码,可把邻近的所有红外线设备 I D列举出来:第6章计地址家族和名字解析计计109下载在向g e t s o c k o p t调用投递一个D E V I C E L I S T结构之前,别忘了把n u m D e v i c e字段设成0。一次成功列举会把n u m D e v i c e字段设成一个大于0的值,并把D e v i c e字段中I R D A _ D E V I C E _ I N F O结构数量设为前一个值。同时,在实际应用中,为检查新使用的设备,可能会多次执行g e t s o c k o p t。举个例子来说,一个很好的例子就是试着进行五次或少于五次
35、的红外线设备查找。方法很简单:在未成功列举之后,利用短期调用 S l e e p,把该调用置入循环即可。现在,大家已知道如何列举红外线设备,创建一个客户机或服务器就更简单了。同级的服务器端更为简单,因为它像一个“普通”服务器。也就是说,不需要额外的步骤。创建I r S o c k服务器的常见步骤如下;1)建立一个地址家族A F _ I R D A套接字和套接字类型S O C K _ S T R E A M。2)用服务器的服务名填写一个S O C K A D D R _ I R D A结构。3)利用套接字句柄和S O C K A D D R _ I R D A结构调用b i n d。4)利用套接
36、字句柄和b a c k l o g边限调用l i s t e n。5)为接入客户机锁定一个a c c e p t调用。建立客户机的步骤稍微有些复杂,因为必须先把红外线设备列举出来。建立I r S o c k客户机所需步骤如下:1)建立地址家族A F _ I R D A套接字和套接字类型S O C K-S T R E A M。2)调用有I R L M P _ E N U M _ D E V I C E S选项的g e t s o c k o p t函数,列举所有可用的红外线设备。3)针对返回的每个设备,利用设备 I D和准备连接的服务名填写一个 SOCKADDR_ IRDA结构。4)利用套接字句
37、柄和S O C K A D D R _ I R D A结构,调用c o n n e c t函数。针对步骤3)中所填的结构,重复步骤4),直到连接成功。6.2.4 查询IAS要知道特定服务是否在特定的设备上运行,有两种方法。第一种是真正与特定服务连接;另一种是向I A S查询特定的服务名。两种方法都要求列举红外线设备,然后对每一个设备进行查询直到达到目的或所有的设备都查完。执行查找是调用带有 I R L M P _ I A S _ Q U E RY选项的g e t s o c k o p t函数来完成的。再次提醒大家注意,I A S _ Q U E RY结构有两个,一个针对Windows 98和
38、Windows 2000,另一个针对Windows CE。各结构的格式如下:110计计第二部分附Winsock API下载第6章计地址家族和名字解析计计111下载大家可看到,除了特定字符数组的长度不同之外,这两个结构的格式是差不多的。要对特定服务的L S A P-S E L数有多少进行查询,很简单:把 i r d a C l a s s N a m e字段设为L S A P-S E L的属性字串,即I r D A:I r L M P:L s a p S e l,然后,把i r d a A t t r i b u t e N a m e字段设成准备查询的那个服务名。除此以外,还必须用范围内的有效
39、设备来设置 i r d a D e v i c e I D字段。6.2.5 创建套接字红外线套接字的创建很简单。几乎不需要任何选项,这是因为 I r S o c k只支持面向连接的数据流。下面的代码说明了如何利用s o c k e t或W S A S o c k e t调用来建立红外线套接字。由于Winsock 1.1的限制,必须采用Windows CE的s o c k e t。如果不想因循守旧,可把I R D A _ P R O TO _ S I C K _ S T R E A M当作上面任何一个函数的协议参数投递出去。但系统不需要这个协议参数,因为传输目录中只有一个地址家族 A F _ I
40、 R D A条目。指定A F _ I R D A会造成默认使用这个传输条目。6.2.6 套接字选项对I r D A来说,大多数S O _ s o c k e t选项都是没有意义的,只有 S O _ L I N G E R得到了特别的支持。I r S o c k特有的套接字选项当然也得到了支持,不过只限于地址家族 A F _ I R D A套接字上。我们将在第9章全面论述这些选项,第9章还对所有套接字选项及其参数进行了总结。6.3 IPX/SPX“互联网包交换”(I P X)协议是一个常见协议,一般为承担 Novell NetWa r e客户机服务器联网服务的计算机所用。I P X提供两个进程间
41、的无连接通信;因此,如果一个工作站发出一个数据包,该协议无法保证这个数据包会准确无误地投递到目标地点。如果应用程序需要数据投递保证,但仍坚持使用I P X,它就会选用一个比I P X高级的协议,比如说“顺序分组交换”(S P X)和SPX II协议,这两个协议中,S P X包通过I P X发送。Wi n s o c k为应用程序提供了在Wi n d o w s平台上通过I P X进行通信的能力(它们是Windows 95、Windows 98、Windows NT以及Windows 2000),但没有提供Windows CE平台上通过I P X通信的能力。6.3.1 编址I P X网络、网段是
42、用I P X路由器桥接在一起的。每个网段分配 4字节的唯一地址号。当更多的网段桥接在一起时,I P X路由器管理网段之间的通信,每个网段有唯一的网段号。连网时,使用唯一的6字节网段号,这个号也往往是转接器的物理地址。一个节点(也就是一台计算机)一般有一个或多个通信进程用I P X通信。I P X用套接字号来区分一个节点上的通信。要用I P X进行Wi n s o c k客户机或服务器通信,必须建立 S O C K A D D R _ I P X结构。该结构在W s i p x.h头文件中定义,应用程序在包括Winsock 2.h文件之后还必须包括该文件。S O C K A D D R _I P
43、 X结构如下定义:s a _ f a m i l y字段应设为A F _ I P X值,s a _ n e t n u m字段是4字节的地址,代表I P X网络上网段号,s a _ n o d e n u m字段是6字节的地址,代表节点计算机的物理地址,s a _ s o c k e t字段代表一个节点区分I P X通信的套接字或接口。6.3.2 创建套接字利用I P X创建套接字提供了几种可能性。要打开 I P X套接字,调用带有地址家族 A F _ I P X、套接字类型以及N S P R O TO _ I P X协议的s o c k e t函数或W S A S o c k e t函数即可
44、,过程如下:112计计第二部分附Winsock API下载注意,第三个参数协议是必须指定的,而且不能为 0。这一点相当重要,因为该字段还可用于设置特定I P X包的类型。正如我们前面提到的那样,I P X利用数据报提供不可靠的无连接通信。如果一个应用需要可靠的无连接通信,可采用比 I P X高级的协议,比说 S P X和SPX II。要做到这一点,把 s o c k e t和W S A S o c k e t调用的类型和协议字段分别设置成套接字类型S O C K _ S E Q PA C K E T或S O C K _ S T R E A M和协议字段N S P R O TO _ S P X或
45、N S P R O TO_SPX II即可。如果指定了S O C K _ S T R E A M,系统就会把数据当作连续不断的字节流发送出去,没有消息边界,这类似于 T C P/I P中套接字的行为。另一方面,如果发送端发出2 0 0 0个字节,在这2 0 0 0个字节全部到达接收端之前,接收端是不会返回任何消息的。对 S P X和SPX II来说,这是通过设置 S P X头中的消息结束位来完成的。指定SOCK_ STREAM 时,要注意这个位,Winsock recv和W S A R e c v调用在其收到这个位之前不会中止。如果指定 S O C K _ S T R E A M时没有注意到这
46、个消息结束位,一旦接收端收到数据,r e c v就会中止,不管消息结束位设在哪里。从发送端这一方来说(使用 S O C K _ S E Q PA C K E T类型),如果发送的数据包小于一个完整的数据包,消息结束位就会随这个包一起发送。如果发送的包大于一个完整的数据包,消息结束位就只设在最后发送的那个包中,而不是每个包都有。1.绑定套接字I P X应用通过b i n d把本地地址和套接字关联在一起时,不要在 S O C K A D D R _ I P X结构中指定网络号和节点地址。b i n d函数利用系统上可用的第一个 I P X网络接口来填充这些字段。如果一台计算机有多个网络接口(多址计
47、算机),它就不必绑定特定的接口。Windows 95、Windows 98、Windows NT和Windows 2000提供一个虚拟内部网,不管它直接连接的物理网络如何,该虚拟网中的每个接口都是可以抵达的。我们稍后将对内部网络编号进行详细论述。应用成功绑定本地接口之后,便可利用下属代码段中的 g e t s o c k n a m e函数获得本地网络编号和节点编号的信息。第6章计地址家族和名字解析计计113下载114计计第二部分附Winsock API下载2.网络编号与内部网络编号网络编号(通常称作外部网络编号)用于标识 I P X中的网络段和I P X报在网络段之间的路由选择。Window
48、s 95、Windows 98、Windows NT以及Windows 2000平台特别突出了内部网络编号,这个内部网络编号用于内部路由选择和对网间网(几个网络桥接在一起构成)上的计算机进行唯一性标识。内部网络编号也称为“虚拟网号”,即内部网络编号对网间网中的另一个(虚拟的)网络段进行标识。因此,如果一台计算机正在运行 Windows 95、Windows 98、Windows NT或Windows 2000,若打算为它配置一个内部网络编号,N e t Wa r e服务器或I P X路由器就会在自己与那台计算机的路由之间另增一次跳跃。在多址计算机情形下,内部虚拟网络用于某一特定目的。应用程序绑
49、定本地网络接口时,不应该指定本地接口信息,但需要把S O C K A D D R _ I P X结构的s a _ n e t n u m和s a _ n o d e n u m这两个字段设置为0。这是因为I P X能够通过内部虚拟网络的使用,把一个数据包从任何一个外部网络路由到任何一个本地网络接口。比如,即使你的应用程序明显地绑定网络 A上的网络接口,而数据包却来自网络B,内部网络编号就会使这个数据包在内部路由,这样,你的应用程序就收到这个数据包了。3.通过Wi n s o c k,设置I P X数据包的类型在利用N S P R O TO _ I P X建立套接字时,Wi n s o c k允
50、许应用程序指定I P X包的类型。I P X包内的数据包类型字段表明这个 I P X包提供或请求的服务类型。在 N o v e l l网中,下面的I P X包类型的定义是:0 1 h:路由信息协议(R I P)包。0 4 h:服务声明协议(S A P)包。0 5 h:顺序分组交换(S P X)包。11 h:N e t Ware Core协议(N C P)包。1 4 h:Novell NetBIOS的传输包。要修改I P X包类型,只须把N S P R O TO_IPX+N指定为socket API的协议参数,n表示数据包类型的编号。比如,要打开一个把包类型设为 0 4 h(S A P包)的I