RPC远程过程调用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

RPC远程过程调用在顾客服务员模型中,进程之间的相互作用是由一个进程先向另一个进程发送一个报文请求服务,然后等待回答;服务进程接收一个请求,然后发送回答。这样一种交互作用很象通常意义的过程调用。但是在计算机网络系统中,这种调用可能在不同的机器上执行,因此称为远程过程调用(remoteprocedurecall)。远程过程调用的基础是XDR协议。11.1XDR标准11.1.1数据结构传输的问题在异构的网络系统中,在顾客进程和服务器进程之间可能需要传递一些复杂的数据结构,这些数据结构可能用于控制进程的行为或者返回进程处理的结果。在数据结构传输过程中可能存在的问题有:1.网络字节序问题不同类型的计算机系统对于数据的存储格式可能不同,例如对于一个整数int,PC机存储时低位字节在前,而高位字节在后;而Sun工作站存储时是低位字节在后,而高位字节在前。这将导致它们对相同整数的2进制序列理解不同。2.浮点数的传递浮点数的传递比整数更加困难,通常浮点数使用若干比特表示整数部分,其它比特表示小数部分。不同类型的浮点数float和double,它们使用的比特数不同,这使得在网络中传递它们有一定的困难。对于浮点数的处理,用户可以将浮点数前后的两个部分分别看成两个整数,分别进行传递,也可以将浮点数看成字符串的形式传递。3.指针的处理在数据结构传递中,指针的传递是最困难的,因为指针的含义是本机上存放某个数据的地址,这个地址在远端的主机上没有意义。所以用户必须传递的是指针的内容而不是指针本身。例如,对于一个字符串指针,用户需要将字符串的内容包含在数据内容中,同时还需要包含字符串的长度信息。11.1.2XDR标准数据类型的传输可以多种多样,用户可以使用自己定义的规则,满足应用程序的数据结构传递。但是如果要使网络程序能够很好地同其它网络程序互通,则需要遵循一个公共的标准。在数据传递过程中实际使用的标准是Sunmicrosystem设计的XDR标准。11.1.2.1XDR标准中包含的数据类型Sunmicrosystem设计的XDR标准规定了在网络中传输数据如何表示成公共的形式,它已经成为大多数顾客服务员应用中的事实上的标准。在XDR标准中定义了表11-1中的数据类型。表11-1XDR标准中的是数据类型数据类型长度(bits)含义int3232比特的2进制符号整数unsignedint3232比特的2进制无符号整数bool32布尔值,用1或0表示enum任意枚举类型,值被定义成常数hyper6464比特的2进制符号整数unsignedhyper6464比特的2进制无符号整数float32单精度浮点数double32双精度浮点数opaque任意不对这样的字节序列进行转化string任意ASCII字符串fixedarray任意任何其它数据类型的定长数组countedarray任意数组中的类型有一个固定上界,但各个数组的上限大小不同structure任意数据的聚合,类似C语言中的结构discriminatedunion任意类似C语言中的union,可以在几种形式中选择一种数据类型void0如果数据项可选,它又没有给出具体数据,则使用这种类型symbolicconstant任意一个符号常量及相关值optionaldata任意允许一个数据出现0次或1次XDR标准中的数据类型和C语言中的数据类型非常相似,XDR允许有结构数组,结构中可以有多个字段,每个字段成员可以是一个数组、结构或者联合,它完全能够适应复杂数据结构的传递。11.1.2.2XDR实现的原理XDR对各种数据类型规定了编码的方式。用户可以使用函数xdrmem_create在内存中创建一个XDR流来存放用户将要发送的数据结构。在初始化后的XDR流包含一个流的头部,函数xdrmem_create的使用方法如下:#includerpc/xdr.hexternvoidxdrmem_create((XDR*xdrs,constcaddr_taddr,u_intsize,enumxdr_opxop));其中,变量xdrs是创建XDR流的指针,变量addr是内存中用于存放XDR流空间的起始地址,变量size是这个空间的长度,变量xop是说明对函数xdrmem_create调用的操作,其定义如下:enumxdr_op{XDR_ENCODE=0,XDR_DECODE=1,XDR_FREE=2};如果变量xop取XDR_ENCODE,则创建一个用于发送的XDR流;如果变量xop取XDR_DECODE,则创建一个用于接收的XDR流;如果变量xop取XDR_FREE,则释放这个XDR流。随后假如用户调用相应的函数来填写一个整数0x00000004,XDR流的结果如图11-1所示。XDR在编码中并没有提供关于数据类型的信息。例如,当XDR对一个32比特的整数进行编码时,编码的结果仍然是32比特,所以,只有数据的接收者知道这32比特的数据类型时,数据的接收者才能正确地恢复这项数据。因此,用户必须配对地编写发送和接收函数,分别处理每个数据项。11.1.2.3XDR的转换函数库1.转换函数库在XDR库函数中提供了对各种数据类型进行编码和解码的函数。这些函数具体进行编码还是解码,不是由这些函数决定的,而是由函数中XDR流的性质决定。当XDR流被创建为编码流,则这些函数将对数据进行编码处理;当XDR流被创建为解码流,则这些函数对数据进行解码处理。表11-2列出了XDR库函数中进行类型转化的函数。用户在调用这些函数之前,必须包含头文件rpc/xdr.h。表11-2XDR中类型转换函数函数调用说明externbool_txdr_void((void));xdr_void用于处理没有数据的空选项externbool_txdr_short((XDR*xdrs,short*sp));xdr_short用于处理short类型数据。xdrs是XDR流指针,sp是指向存放short类型数据空间的指针externbool_txdr_u_short((XDR*xdrs,u_short*usp));xdr_u_short用于处理u_short类型数据。xdrs是XDR流指针,usp是指向存放u_short类型数据空间的指针externbool_txdr_int((XDR*xdrs,int*ip));xdr_int用于处理int类型数据。xdrs是XDR流指针,ip是指向存放int类型数据空间的指针externbool_txdr_u_int((XDR*xdrs,int*up));xdr_u_int用于处理u_int类型数据。xdrs是XDR流指针,up是指向存放u_int类型数据空间的指针externbool_txdr_long((XDR*xdrs,long*lp));xdr_long用于处理long类型数据。xdrs是XDR流指针,流的首部……XDR流的最大长度放进整数4前的结果流的首部……0004放进整数4后的结果图11-1XDR对整数的编码过程lp是指向存放long类型数据空间的指针externbool_txdr_u_long((XDR*xdrs,u_long*ulp));xdr_u_long用于处理u_long类型数据externbool_txdr_hyper((XDR*xdrs,u_quad_t*llp));xdr_hyper用于处理hyper64比特类型数据。llp是指向hyper类型的指针externbool_txdr_u_hyper((XDR*xdrs,u_quad_t*ullp));xdr_u_hyper用于处理u_hyper64比特类型数据。ullp是指向u_hyper类型的指针externbool_txdr_longlong_t((XDR*xdrs,quad_t*llp));类似函数xdr_hyperexternbool_txdr_u_longlong_t((XDR*xdrs,u_quad_t*llp));类似函数xdr_u_hyperexternbool_txdr_int8_t((XDR*xdrs,int8_t*ip));用于处理8比特符号整数类型数据externbool_txdr_uint8_t((XDR*xdrs,uint8_t*up));用于处理8比特无符号整数类型数据externbool_txdr_int16_t((XDR*xdrs,int16_t*ip));用于处理16比特符号整数类型数据externbool_txdr_uint16_t((XDR*xdrs,uint16_t*up));用于处理16比特无符号整数类型数据externbool_txdr_int32_t((XDR*xdrs,int32_t*ip));用于处理32比特符号整数类型数据externbool_txdr_uint32_t((XDR*xdrs,uint32_t*up));用于处理32比特无符号整数类型数据externbool_txdr_int64_t((XDR*xdrs,int64_t*ip));用于处理64比特符号整数类型数据externbool_txdr_uint64_t((XDR*xdrs,uint64_t*up));用于处理64比特无符号整数类型数据externbool_txdr_bool((XDR*xdrs,bool_t*bp));用于处理bool_t类型数据externbool_txdr_enum((XDR*xdrs,enum_t*ep));用于处理枚举类型数据externbool_txdr_array((XDR*xdrs,caddr_t*addrp,u_int*sizep,u_intmaxsize,u_intelsize,xdrproc_telproc));用于处理数组类型数据externbool_txdr_bytes((XDR*xdrs,char**cpp,u_int*sizep,u_intmaxsize));用于处理字节类型数据externbool_txdr_opaque((XDR*xdrs,caddr_tcp,u_intcnt));用于处理opaque类型数据externbool_txdr_string((XDR*xdrs,char**cpp,u_intmaxsize));用于处理字符串类型数据externbool_txdr_union((XDR*xdrs,enum*dscmp,char*unp,conststructxdr_discrim*choices,xdrprocdfault));用于处理联合类型数据externbool_txdr_char((XDR*xdrs,char*cp));用于处理字符类型数据externbool_txdr_u_char((XDR*xdrs,u_char用于处理u_char类型数据*cp));externbool_txdr_vector((XDR*xdrs,char*basep,u_intnelem,u_intelemsize,xdrproc_txdr_elem));用于处理vector类型数据externbool_txdr_float((XDR*xdrs,float*fp));用于处理float类型数据externbool_txdr_double((XDR*xdrs,double*dp));用于处理double类型数据externbool_txdr_reference((XDR*xdrs,caddr_t*xpp,u_intsize,xdrproc_troc));用于处理reference类型数据externbool_txdr_pointer((XDR*xdrs,char**objpp,u_intobj_size,xdrproc_txdr_obj));用于处理pointer类型数据externbool_txdr_wrapstring((XDR*xdrs,char**cpp));用于处理wrapstring类型数据externu_longxdr_sizeof((xdrproc_t,void*));获

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功