chhs 第章地址家族和名字解析07 应用打算与运行于本地或远程计算机上的服务进行通信时,除了要知道远程计算机的IP 地址外,还必须知道服务的端口号。在使用TCP和UDP时,应用必须决定计划通过哪些端口 进行通信。有几个“已知的端口号”是服务器服务保留的,这些服务支持比TCP高级的协议 (比如TCP和SPX)。举个例子来说,端口21是为FTP预留的,端口80是为FTTP预留的。正如 前面提到的那样,已知的服务一般都采用1~1023之间的端口号来设置协议。如果你正在开发 个不使用任何一种已知服务的TCP应用,就要考虑采用1023以上的端口,以免重复。通过 调用 getservbyname和 WSAAsyncGetServ By Name函数,便可获得已知服务的端口号。这两个 函数只从名为 services的文件中获得静态信息。 Windows95和 Windows98中,服务文件位于 % WINDOWS%下面:在 Windows nt和 Windows2000中,则位于% WINDOWS% System32 Drivers\Etc下面。 getservbyname函数的定义如下 struct servent FAR* getservbyname( const char FAR name, const char FAR proto name参数代表准备查找的服务名。举个例子来说,如果你正在定位FTP端口,就应该把 name参数设成指向字串“ftp"。 proto参数随便指向一个字串,这个字串表明name中的服务是 在这个参数中的协议下面注册的。 WSAAsyncGetServ By Name函数是 getservbyname函数的异 Windows2000中有一个新的注册和请求TCP及UDP服务信息的动态方法。服务器应用可 利用 WSASetservice函数来注册服务名、IP地址和服务的端口号。客户机应用可利用这三个API 函数的组合请求这条服务信息,这三个函数是 WSALookup Service Begin、 WSALookup ServiceNext 和 WSALookupServiceEnd。第10章将对此进行讨论 62红外线套接字 红外线套接字称为 IrSock,它是一个令人兴奋不已的新技术,首先在 Windows平台上亮相 红外线套接字允许两台计算机通过红外线串行端口进行通信。目前,红外线套接字可在 Windows98和 Windows2000上使用。红外线套接字不同于传统意义上针对便携机的短暂性而 设计的套接字。它们展示了一种新的名字解析模型,下一小节中将对此进行讨论 621定址 由于带有“红外线数据联盟”( Infrared Data association,IrDA)设备的大多数计算机可 能经常性地拆卸,传统的名字解析方案不能满足人们的需求。传统解析方法充当命名服务器 之类的静态资源——人们在移动正在运行网络客户任务的手提式电脑或膝上型计算机时,是 不能使用这些资源的。为解决这一问题,IrDA就设计成了这样:无须在整个大型网络上,只 须用一种特定的方式浏览范围内的资源,因此,IDA没有使用标准的 Winsock命名服务函数和 IP定址。相反,命名服务已并入通信流,另外还引入了一个新的地址家族,以支持与红外线 串行端口绑定在一起的服务。 IrSock地址结构中包含一个服务名(它对绑定和连接调用中所使 用的应用进行描述)和一个设备标识符(描述运行服务的设备)。这里的服务名和设备标识符 类似于传统TCPP套接字所用的IP地址和端口号字元组。 IrSock地址结构的定义如下 typedef struct sockaddr_irda t
第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之间的端口号来设置协议。如果你正在开发 一个不使用任何一种已知服务的 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 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 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平台上亮相。 红外线套接字允许两台计算机通过红外线串行端口进行通信。目前,红外线套接字可在 Windows 98和Windows 2000上使用。红外线套接字不同于传统意义上针对便携机的短暂性而 设计的套接字。它们展示了一种新的名字解析模型,下一小节中将对此进行讨论。 6.2.1 定址 由于带有“红外线数据联盟”(Infrared Data Association, IrDA)设备的大多数计算机可 能经常性地拆卸,传统的名字解析方案不能满足人们的需求。传统解析方法充当命名服务器 之类的静态资源—人们在移动正在运行网络客户任务的手提式电脑或膝上型计算机时,是 不能使用这些资源的。为解决这一问题, I r D A就设计成了这样:无须在整个大型网络上,只 须用一种特定的方式浏览范围内的资源,因此, I r D 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地址结构的定义如下:
108第二部分Wmky 下载 u_short irdaAddress Family: irdaDevicelD[4] irdaserviceName [25] SOCKADDRIRDA: rdaAddressFamily字段一直都是 AF IRDA. irdaDeviceID是一个4字符的字串,用于唯 性地标识特定服务所运行的设备。在建立 IrSock服务器时,这个字段是忽略不计的。但是对客 户机而言,却非常重要,因为它指定的是准备连接的那个IrDA设备(也可能有若干个)。最后, rdaServicename字段是服务名,应用要么利用这项服务对其本身进行注册,要么试着与这项 服务建立连接。 622名字解析 定址可以利用“IrDA逻辑服务访问点选择符( LSAP-SEL)”或“信息访问服务”(IAS) 注册的服务为基础。IAS从一个 LSAP-SEL中摘出一项服务,并把它置入用户友好的文本服务 名中,方式和互联网域名服务器把名字映射到数字化IP地址差不多。要成功建立一个连接 既可以用LSAP-SEL,又可以用用户友好名。不过,用户友好名需要名字解析。大多数时候 都不要使用直接的 LSAP-SEL“地址”,因为IrDA服务的地址空间是限制了的。Win32实施方 案允许 LSAP-SEL整数标识符,标识符的范围是1到127。从本质上说,我们可把IAS服务器当 作一个WINS服务器,因为它把 LSAP-SEL和一个文字化的服务名关联在一起。 事实上的IAS条目有三个重要字段:类名、属性和属性值。举个例子来说,一个服务器希 望在服务名 MyServer下对其本身进行注册。这是服务器通过相应的 SOCKADDR_IRDA结构执 行绑定调用时完成的。这种情况一旦发生,就会增加一个IAS条目,该条目中包括类名 MyServer、属性 IrDA: Tiny TP:Lsap-SEL和属性值3。属性值就是下一个未用过的LSAP-SEL, 这个LSAP-SEL是系统根据注册来分配的。另一方面,客户机向连接调用投递一个 SOCKADDR_IRDA结构。随后便开始IAS查找,查找带有类名 MyServer和属性 IrDA: Tiny TP: Lsap-SEL的那项服务。IAS查询会返回3这个值。用户可利用 getsocketopt调用中 的套接字选项 IRLMP IAS QUERY来定制自己的IAS查询。 如果打算完全忽略IAS(一般不建议使用),则可为客户机准备连接的服务名或终端直接 指定一个 LASP-SEL地址。忽略IAS后,就只能和不提供任何IAS注册的老IrDA设备(比如红 外线打印机)进行通信。把 SOCKADDR IRDA结构中的服务名指定为 LSAP-SEL-xxx,就可 忽略IAS注册和査找。其中,xxx处是属性值,其范围在1到127之间。对服务器而言,这样会 直接为该服务器分配特定的 LSAP-SEL地址(假定这个 LSAP-SEL地址尚未使用)。对客户机 而言,这样会忽略IAS查找,并试图马上与运行于指定的 LSAP-SEL上的任何一项服务建立连 623红外线设备列举 由于红外线设备的使用地点不固定,因此,必须有一种方法,可以动态地把特定范围内 的所有可用红外线设备列举出来。我们先从 Windows ce实施方案和 Windows98及 Windows 2000实施方案之间的几点差别谈起。 Windows ce先于其他平台支持 IrSock,并提供少量与红 外线设备有关的信息。后来, Windows98和 Windows2000也开始支持 IrSock,但它们新增了 另外的“提示”信息,该信息是由列举请求返回的(关于提示信息,我们稍后将简要论述)
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字符的字串,用于唯一 性地标识特定服务所运行的设备。在建立 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中摘出一项服务,并把它置入用户友好的文本服务 名中,方式和互联网域名服务器把名字映射到数字化 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 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 : Ti 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,就可 忽略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 s 2 0 0 0实施方案之间的几点差别谈起。 Windows CE先于其他平台支持I r S o c k,并提供少量与红 外线设备有关的信息。后来, Windows 98和Windows 2000也开始支持I r S o c k,但它们新增了 另外的“提示”信息,该信息是由列举请求返回的(关于提示信息,我们稍后将简要论述)。 108计计第二部分附Winsock API 下载
0a109 这样一来, Windows ce的 AF irda. h头文件中包含的是原始的、少量的结构定义;但是,其他 平台提供的新的头文件中包含的则是目前支持 IrSock的各个平台的条件结构定义。为了保持 致,我们建议大家采用较新的 Af irda. h头文件 列举临近红外线设备的方法是采用 getsockopt的 IRLMP ENUM_ DEVICE命令。 DEVICELIST结构被当作 optval参数投递。这里有两个结构,一个针对 Windows98和 Windows 2000,另一个针对 Windows Ce。这两个结构的格式如下 typedef struct _WINDOWS_DEVICELIST numDeyice WINDOWS_ IRDA_DEVICE_INFO Device[1]: F WINDOWS_DEVICELIST,*PWI NDOWS_DEVICELIST, FAR *LPWINDOWS_DEVICELIST typedef struct _WCE_DEVICELIST ULONI numDevice wCE_ IRDA DEⅤ ICEINF0 Device[l I WCE_ DEVICELIST, *PWCE-DEVICELIST Windows98和 Windows2000结构与 Windows ce结构之间的唯一区别是 Windows98和 indows2000结构中包含一个 WINDOWS IRDA DEⅤ ICE INFO数组,该数组与WCE IRDA_DEⅤ ICE INFO结构的数组相对应。条件性的# define指令根据目标平台,声明 DEⅤ ICELIST结构是正确的。同样,也有对 IRDA DEⅤ ICE INFO结构的两个声明 typedef struct -WINDOWS_IRDADEVICEINFO u_char irdadeviceID[4] har irdaDeviceName [22]: u char irdadevicehints1 u char irdaDeviceHints2 u_char irda charset: WINDOWS_IRDA_DEVICE_INFO, *PWINDOWS_IRDA_DEVICE_INFO FAR *LPWINDONS_IRDA_DEVICE_INFO typedef struct -WCE-IRDADEVICE_INFO u_char irdadeviceID[4]: har irdadeviceName [22] u_char Reserved[2] WCE_IRDA_DEVICE_INFO. *PWCE_IRDA_DEVICE_INFO: # define指令根据目标平台,向正确的结构定义声明 IRDA DEVICE INFO。 正如前面提到的那样,真正用于列举红外线设备的函数是带有 IRLMP ENUM DEⅤICES 选项的 getsockopt函数。下面这一段代码,可把邻近的所有红外线设备ID列举出来 SOCKET devicelist delist DWORD dwListLen=sizeof(DEVICELIST) sock WSASocket(AF_IRDA, SOCK STREAM, 0, NULL, 0 WSA__OVERLAPPED) delist. numDevice = 0:
这样一来,Windows CE的A F _ i r d a . h头文件中包含的是原始的、少量的结构定义;但是,其他 平台提供的新的头文件中包含的则是目前支持 I r S o c k的各个平台的条件结构定义。为了保持一 致,我们建议大家采用较新的 A f _ i r d a . h头文件。 列举临近红外线设备的方法是采用 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 s 2 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数组,该数组与 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 t函数。下面这一段代码,可把邻近的所有红外线设备 I D列举出来: 第6章计地址家族和名字解析计计109 下载
110 第二部分 Winsock API China-pub.com 下载 dwRet getsockopt(sock, SOL_IRLMP, I RLMP_ENUMDEVICES (char *)&delist, &dwListLen) 在向 getsockopt调用投递一个DEⅤ CELIST结构之前,别忘了把 num Device字段设成0 次成功列举会把 num Device字段设成一个大于0的值,并把 Device字段中 IRDA DEVICE INFO 结构数量设为前一个值。同时,在实际应用中,为检查新使用的设备,可能会多次执行 getsockopt举个例子来说,一个很好的例子就是试着进行五次或少于五次的红外线设备查找 方法很简单:在未成功列举之后,利用短期调用 Sleep,把该调用置入循环即可。 现在,大家已知道如何列举红外线设备,创建一个客户机或服务器就更简单了。同级的 服务器端更为简单,因为它像一个“普通”服务器。也就是说,不需要额外的步骤。创建 IrSock服务器的常见步骤如下: 1)建立一个地址家族 AF IRDA套接字和套接字类型 SOCK STREAM 2)用服务器的服务名填写一个 SOCKADDR IRDA结构 3)利用套接字句柄和 SOCKADDR IRDA结构调用bind 4)利用套接字句柄和 backlog边限调用 lister 5)为接入客户机锁定一个 acceptt调用 建立客户机的步骤稍微有些复杂,因为必须先把红外线设备列举出来。建立 IrSock客户 机所需步骤如下: 1)建立地址家族 AF IRDA套接字和套接字类型SOCK- STREAM 2)调用有 IRLMP ENUM DEⅥCES选项的 getsockopti函数,列举所有可用的红外线设备 3)针对返回的每个设备,利用设备ID和准备连接的服务名填写一个 SOCKADDR_IRDA 结构。 4)利用套接字句柄和 SOCKADDR IRDA结构,调用 connect函数。针对步骤3)中所填的 结构,重复步骤4),直到连接成功。 624查询As 要知道特定服务是否在特定的设备上运行,有两种方法。第一种是真正与特定服务连 接:另一种是向IAS查询特定的服务名。两种方法都要求列举红外线设备,然后对每一个设备 进行查询直到达到目的或所有的设备都查完。执行查找是调用带有 IRLMP IAS_ QUERY选项 的 getsockopt函数来完成的。再次提醒大家注意,IAS_ QUERY结构有两个,一个针对 indows98和 Windows2000,另一个针对 Windows Ce。各结构的格式如下 typedef struct_WINDOWS_IAS_QUERY u_char irdaDeviceID[4] char irdaclassName[IAS_MAX_ClaSSNaMe] char irdaAttri bName[IAS_MAX_ATTRIBNAME] u_long irdaAttribType: LONG irdaAttribint struct u_char octetseq[IAS_MAX_OCTET-STRING]
在向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。举个例子来说,一个很好的例子就是试着进行五次或少于五次的红外线设备查找。 方法很简单:在未成功列举之后,利用短期调用 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) 利用套接字句柄和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) 利用套接字句柄和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和Windows 2000,另一个针对Windows CE。各结构的格式如下: 110计计第二部分附Winsock API 下载
Ca°pd0 第6章地址家族和名字解析 111 下载 f irdaAttriboctetSeq u_long Len u_long Charset u_char UsrStr[IAS_MAX_USER STRING] irdaAttribUsrStr; f irdaAttribute WINDOWS_IAS_QUERY, *PWINDOWS.IAS_ QUERY FAR*LPWINDOWS_ IAS QUERY typedef struct_WCE_IAS_QUERY u char irdaclassName [61] char irdaAttribName [61 u_short irdaAttribType union int irdaAttriblnt struct int u__char 0ctetseq[1] u_char Reserved[3] f irdaAttriboctetSeq struct int char Char Set u_char UsrStr[l]: u_char Reserved[2] b irdaAttribUsrstr b irdaAttribute I WCE IAS_QUERY, *PWCEIAS QUERY 大家可看到,除了特定字符数组的长度不同之外,这两个结构的格式是差不多的 要对特定服务的LSAP-SEL数有多少进行查询,很简单:把 irda classname字段设为LSAP SEL的属性字串,即 IrDA: IrLMP: LsapSel,然后,把 irdaAttribute name字段设成准备查询的那 服务名。除此以外,还必须用范围内的有效设备来设置 irdadeviceID字段。 625创建套接字 红外线套接字的创建很简单。几乎不需要任何选项,这是因为 IrSock只支持面向连接的数 据流。下面的代码说明了如何利用 socket或 WSASocket调用来建立红外线套接字。由于 Winsock1.1的限制,必须采用 Windows CE的 socket s socket(AF_IRDA, SOCK_STREAM, 0): S= WSASocket(aF IRDA, SoCK STREAM, 0, NULL, 8 WSA FLAG OVERLAPPED) 如果不想因循守旧,可把 IRDA PROTO SICK STREAM当作上面任何一个函数的协议参 数投递出去。但系统不需要这个协议参数,因为传输目录中只有一个地址家族 AF IRDA条目
第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字段设成准备查询的那 个服务名。除此以外,还必须用范围内的有效设备来设置 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 R D A条目