《《远程过程调用》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《远程过程调用》PPT课件.ppt(24页珍藏版)》请在三一办公上搜索。
1、第 四 讲远程过程调用,1、动因与实例2、工作原理3、编排/还原4、请求分派,内 容,1、动因与实例,开发基于SOCKET的网络软件非常复杂FTPTELNET位于不同机器上的软件互操作困难连接管理异构导致RPC(Remote Procedure Calling)的产生主要实例:SUN公司等提出的ONC(Open Network Computing)RPC主要由SUN予以实现OSF(Open Software Foundation)RPC影响最大主要由DCE(Distributed Computing Environment)实现 DCE是OSF提出的分布计算体系结构,2、工作原理,Deposi
2、t(,1000,),继续运行,启动服务器上的存款过程,int Deposit(number),return total+number;,客户端程序,服务器端程序,以对某银行帐户的一个存款过程为例:,Network,Local Call,send,receive,send,receive,(1)调用过程,客户端程序,服务器端程序,1、客户按本地调用的方式 直接调用本地的客户指代客户指代具有与服务器相同的过程接口2、客户指代 将客户的调用请求进行加工、打包向底层通信机制(如套接字)发出请求消息客户指代不进行任何逻辑处理只是一个中介3、客户端通过底层的通信机制将消息传送给服务器端的底层通信机制,过程
3、描述:,4、服务器 需要部分地解析消息找出客户希望调用的服务器程序5、服务器指代对消息进行解析从中获得调用者的参数然后调用服务器程序6、服务器程序执行相应的过程7、服务器程序将结果返回给服务器指代8、服务器指代将结果打包向底层通信机制发出应答消息9、服务器端通信机制将消息传送给客户端通信机制,10、客户端节点上也可能有多个调出点通信机制需要部分地解析返回的消息找出消息应该返回给哪个客户程序并将消息发送给对应的客户指代 11、客户指代从消息中解析结果返回给客户程序,(2)编排/还原,指代(Stub)的主要工作包括:(1)建立客户与服务器之间的连接(2)将客户的高层调用语句打包为一条底层的请求消息
4、 这一过程在RPC中被称为编排(marshal)(3)等待服务器返回应答消息(4)将来自服务器底层的应答消息解析为可以返回的数据 这一过程在RPC中被称为还原(unmarshal)(5)将返回值传送给客户程序 需要特别处理:编码、字节序 等问题,(3)请求分派,服务器端的指代:除了需要进行编排、还原外还需要区分客户所请求的过程名然后将客户的请求分派(dispatch)给正确的过程“指代”目前主要被用于专门代表客户端的代理程序而服务器端则由新的机制予以支持在CORBA中专门分离出了对象适配器(OA:Object Adaptor)在EJB中发展出了构件容器用于在运行过程中专门管理构件的各种状态此时
5、的服务器端不仅负责请求分派还负责向底层机制的注册(以方便请求的定位)以及过程的激活(以加强系统的灵活性)等等功能,三、基于RPC的开发过程,1、定义并编译接口 2、编写实现具体服务功能的代码3、编译、连接,产生可执行的服务器程序4、编写客户端代码5、编译、连接,产生客户程序6、运行服务器端程序7、运行客户端程序,客户端开发过程,服务器端开发过程,服务器端程序,IDL编译器(rpcgen),客户端程序,IDL,account.h,account_clnt.c,account _svc.c,server.c,client.c,rpclib.o,1、定义并编译接口,仍然结合银行帐号的例子 接口定义文
6、件account.x:,program ACCOUNT version ACCOUNT_VER int deposit(int)=2;int withdraw(int)=1;=1;=0 x20010929;,编译后生成三个主要文件:account.h account_clnt.c account_svc.c,extern C#define ACCOUNT 0 x20010929#define ACCOUNT_VER 1#define deposit 2extern int*deposit_1(int*,CLIENT*);extern int*deposit_1_svc(int*,struct
7、svc_req*);#define withdraw 1extern int*withdraw_1(int*,CLIENT*);extern int*withdraw_1_svc(int*,struct svc_req*);extern int account_1_freeresult(SVCXPRT*,xdrproc_t,caddr_t);,account.h,account_clnt.c,static struct timeval TIMEOUT=25,0;int*deposit_1(int*argp,CLIENT*clnt)static int clnt_res;memset(char*
8、),int main(int argc,char*argv)register SVCXPRT*transp;pmap_unset(ACCOUNT,ACCOUNT_VER);transp=svctcp_create(RPC_ANYSOCK,0,0);if(transp=NULL)fprintf(stderr,%s,cannot create tcp service.);exit(1);if(!svc_register(transp,ACCOUNT,ACCOUNT_VER,account_1,IPPROTO_TCP)fprintf(stderr,%s,unable to register(ACCO
9、UNT,ACCOUNT_VER,tcp).);exit(1);svc_run();fprintf(stderr,%s,svc_run returned);exit(1);,account_svc.c,static void account_1(struct svc_req*rqstp,register SVCXPRT*transp)union int deposit_1_arg;int withdraw_1_arg;argument;char*result;xdrproc_t _xdr_argument,_xdr_result;char*(*local)(char*,struct svc_re
10、q*);switch(rqstp-rq_proc)case NULLPROC:(void)svc_sendreply(transp,(xdrproc_t)xdr_void,(char*)NULL);return;case deposit:_xdr_argument=(xdrproc_t)xdr_int;_xdr_result=(xdrproc_t)xdr_int;local=(char*(*)(char*,struct svc_req*)deposit_1_svc;break;case withdraw:_xdr_argument=(xdrproc_t)xdr_int;_xdr_result=
11、(xdrproc_t)xdr_int;local=(char*(*)(char*,struct svc_req*)withdraw_1_svc;break;,default:svcerr_noproc(transp);return;memset(char*),2、编写实现具体服务功能的代码,#include account.hint total=10000;int*deposit_1_svc(int*argp,struct svc_req*rqstp)static int result;total=total+argp;result=total;printf(“new total=%s”,to
12、tal);return,server.c,3、编译、连接,产生可执行的服务器程序,cc o server server.c account_svc.c account.h,4、编写客户端代码,#include account.hvoid account_1(char*host)CLIENT*clnt;int*result_1;int deposit_1_arg=1000;int*result_2;int withdraw_1_arg=2000;clnt=clnt_create(host,ACCOUNT,ACCOUNT_VER,tcp);result_1=deposit_1(,client.c,5、编译、连接,产生客户程序,cc o client client.c account_clnt.c account.h,6、运行服务器端程序7、运行客户端程序服务器端应当显示:new total=11000new total=9000客户端应当显示:result=11000 result=9000,思 考 题,消息传递、互操作、协同工作之间的关系是什么?RPC是如何工作的?不同互操作体系的异同点是什么?,