中間件_遠(yuǎn)程過(guò)程調(diào)用課件_第1頁(yè)
中間件_遠(yuǎn)程過(guò)程調(diào)用課件_第2頁(yè)
中間件_遠(yuǎn)程過(guò)程調(diào)用課件_第3頁(yè)
中間件_遠(yuǎn)程過(guò)程調(diào)用課件_第4頁(yè)
中間件_遠(yuǎn)程過(guò)程調(diào)用課件_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、RPC(遠(yuǎn)程過(guò)程調(diào)用)RPC機(jī)理在單臺(tái)機(jī)器上構(gòu)建并測(cè)試應(yīng)用程序,然后將程序劃分為兩個(gè)或多個(gè)程序片,加入通信協(xié)議以允許每片程序在單獨(dú)的計(jì)算機(jī)上運(yùn)行。從一個(gè)程序片調(diào)用另一個(gè)程序片的過(guò)程稱(chēng)為遠(yuǎn)程過(guò)程調(diào)用,即RPC。RPC是一個(gè)Client/Server模型,調(diào)用程序片(本地程序)稱(chēng)為rpc client,被調(diào)用程序片(遠(yuǎn)程程序)稱(chēng)為rpc server。2RPC的通信模型ClientSend(remote call pi()(發(fā)送“請(qǐng)求服務(wù)”信息)Receive(ans)接收回復(fù)信息server接收調(diào)用信息;抽取參數(shù)并分析;調(diào)用所指的過(guò)程;執(zhí)行遠(yuǎn)程過(guò)程返回執(zhí)行結(jié)果Send(ans)發(fā)送回復(fù)信息等待回

2、復(fù)請(qǐng)求服務(wù)等待調(diào)用繼續(xù)返回調(diào)用結(jié)果3RPC的執(zhí)行Local return Local callClient ProcessOP4 Client-stub OP1RPC Routinewaitreceive transmit call work returnServer ProcessOP2 Server-stub OP3RPC Routinereceive transmit123456789104幾個(gè)“經(jīng)久不衰”的重要問(wèn)題數(shù)據(jù)表示如何統(tǒng)一?遠(yuǎn)程程序如何表述?如何獲得遠(yuǎn)程程序?語(yǔ)義問(wèn)題5數(shù)據(jù)表示的問(wèn)題6可能的解決方案1(非對(duì)稱(chēng)方式)7可能的解決方案2(對(duì)稱(chēng)方式)8數(shù)據(jù)表示:XDRXDR 是不同數(shù)

3、據(jù)類(lèi)型規(guī)范化的標(biāo)準(zhǔn)表示。通過(guò)使用一個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類(lèi)型表示,即使數(shù)據(jù)源來(lái)自具有完全不同體系結(jié)構(gòu)的主機(jī),程序也可以確保能夠正確地解釋數(shù)據(jù)。實(shí)踐中,大多數(shù)程序在內(nèi)部不使用 XDR。相反,它們使用程序正運(yùn)行的計(jì)算機(jī)體系結(jié)構(gòu)特定的數(shù)據(jù)類(lèi)型表示。當(dāng)程序需要和其它程序通信時(shí),程序在發(fā)送該數(shù)據(jù)之前將其數(shù)據(jù)轉(zhuǎn)變?yōu)?XDR 格式。反之,當(dāng)接收數(shù)據(jù)的時(shí)候,它將 XDR 格式的數(shù)據(jù)轉(zhuǎn)換為自己特定的數(shù)據(jù)類(lèi)型表示。9XDR機(jī)制(1)創(chuàng)建一個(gè)XDR緩存; #define BUFFERSIZE 4000 XDR *xdrs; char bufBUFFERSIZE; xdrmem_create(xdrs,buf, BUFFERS

4、IZE,XDR_ENCODE); (2) 使用類(lèi)型轉(zhuǎn)換例程將本地?cái)?shù)據(jù)對(duì)象轉(zhuǎn)換成外部數(shù)據(jù)表示; int i=200; xdr_int(xdrs,&i); 10常規(guī)類(lèi)型轉(zhuǎn)換例程 xdr_bool,xdr_int,xdr_float,xdr_string,xdr_vector,復(fù)合類(lèi)型轉(zhuǎn)換 struct example int count; int values2; char buffer4; ;11xdr_example(XDR* xdrs, example* objp)if (!xdr_int(xdrs, &objp-count) return (FALSE);if (!xdr_vector(x

5、drs, (char *)objp-values, 2, sizeof(int), (xdrproc_t)xdr_int) return (FALSE);if (!xdr_vector(xdrs, (char *)objp-buffer, 4, sizeof(char), (xdrproc_t)xdr_char) return (FALSE);return (TRUE);12XDR數(shù)據(jù)表示實(shí)例13RPC interface (xxx.idl) struct example int count; int values2; char buffer4; ; program SQUAREPROG ve

6、rsion SQUAREVERS int square(int)=1; void setExample(example)=2; =1;=0 x30090900;RPC server(遠(yuǎn)程程序 )的表述rpcgen xxx.idl xxx的stub14RPC server的標(biāo)識(shí)program:32bit整數(shù)標(biāo)識(shí)。version :一個(gè)整數(shù)標(biāo)識(shí)。從1開(kāi)始。proc:一個(gè)整數(shù)標(biāo)識(shí)。從1開(kāi)始。0用于測(cè)試。 program的劃分:0 x00000000-0 x1fffffff系統(tǒng)使用0 x20000000-0 x3fffffff用戶(hù)使用0 x40000000-0 x5fffffff0 x60000000

7、-0 xffffffff保留15遠(yuǎn)程程序名遠(yuǎn)程程序號(hào)描述portmap 100000端口映射器rstatd 100001rstatdrusersd 100002nfs 100003網(wǎng)絡(luò)文件系統(tǒng)ypserv 100004yp(現(xiàn)在叫做NIS)mountd 100005dbxd 100006ypbind 100007NIS綁定程序walld 100008rwalldyppasswdd 100009.RPC server的標(biāo)識(shí)(續(xù))16遠(yuǎn)程程序映射到協(xié)議端口 靜態(tài)端口映射:如portmap/111,nfs/2049 動(dòng)態(tài)端口映射:32位prog無(wú)法一一映射到16位的port上。解決方法: (1)RP

8、C提供了一個(gè)動(dòng)態(tài)端口映射器(portmapper ); (2)每個(gè)RPCServer啟動(dòng)的時(shí)候向本機(jī)上運(yùn)行的動(dòng)態(tài)端口映射器注冊(cè)自己的遠(yuǎn)程程序號(hào)、版本號(hào)以及動(dòng)態(tài)獲得的端口號(hào); (3)RPC Client用遠(yuǎn)程程序號(hào)+版本號(hào)向遠(yuǎn)程主機(jī)上的portmapper 查詢(xún)相應(yīng)的動(dòng)態(tài)端口號(hào),一旦rpcclient獲得了rpcserver的動(dòng)態(tài)端口號(hào),就可使用該端口與rpcserver建立socket通信。17圖示18語(yǔ)義問(wèn)題故障發(fā)生位置在被調(diào)用者接收到調(diào)用它的命令之前發(fā)生故障在執(zhí)行其過(guò)程體時(shí),被調(diào)用者發(fā)生故障被調(diào)用者正確地完成了其過(guò)程體的執(zhí)行,但在把結(jié)果返回給調(diào)用者之前發(fā)生故障故障引發(fā)的問(wèn)題 N2 文件內(nèi)容

9、追加19語(yǔ)義規(guī)則Last-of-many:對(duì)執(zhí)行一個(gè)遠(yuǎn)程過(guò)程調(diào)用而言,被調(diào)用的過(guò)程可能執(zhí)行若干次,但規(guī)定其最后一次執(zhí)行的結(jié)果作為返回結(jié)果;At-most-once:若調(diào)用者收到了回復(fù)消息,則稱(chēng)被調(diào)用的過(guò)程正確地完成了它的一次( 僅僅一次)執(zhí)行。如果調(diào)用者沒(méi)有收到回復(fù)消息,或者,如果調(diào)用者在獲得回復(fù)消息之前發(fā)生故障,那么,這時(shí)的調(diào)用效果就看作是根本就沒(méi)有執(zhí)行相應(yīng)的過(guò)程。20語(yǔ)義規(guī)則(續(xù))At-least-once:遠(yuǎn)程調(diào)用過(guò)程至少執(zhí)行一次,回復(fù)消息可能返回一次或多次;Exactly-once:若server正常,則遠(yuǎn)程過(guò)程恰好執(zhí)行一次,并返回一個(gè)調(diào)用結(jié)果21RPC編程1、構(gòu)建解決問(wèn)題的常規(guī)應(yīng)用程

10、序;2、選擇一組過(guò)程形成遠(yuǎn)程程序,以便將遠(yuǎn)程程序轉(zhuǎn)移到遠(yuǎn)程機(jī)器中,通過(guò)這種方法將程序分解;3、為遠(yuǎn)程程序編寫(xiě)RPC界面(xxx.idl),包括遠(yuǎn)程的名字及其編號(hào),還有對(duì)其參數(shù)的申明。選擇遠(yuǎn)程程序號(hào)和版本號(hào);4、運(yùn)行rpcgen檢查該界面,如果合法,便生成四個(gè)源代碼文件:xxx.h(類(lèi)型說(shuō)明文件)、xxx_XDR.c(XDR轉(zhuǎn)換例程)、xxx_clnt.c(客戶(hù)端的stub)以及xxx_svr.c(服務(wù)守護(hù)過(guò)程,服務(wù)端的stub) ,這些文件將在客戶(hù)和服務(wù)器程序中使用;22RPC編程(續(xù))5、為客戶(hù)端和服務(wù)器端編寫(xiě)stub接口例程;6、編譯并鏈接客戶(hù)程序。它由四個(gè)主要文件組成:去掉了遠(yuǎn)程過(guò)程的程

11、序、客戶(hù)端的stub(rpc生成)、客戶(hù)端的stub接口以及XDR過(guò)程( rpc生成)。7、編譯并鏈接服務(wù)器程序。它由四個(gè)主要文件組成:遠(yuǎn)程過(guò)程組成的程序、服務(wù)器的stub(rpc生成)、服務(wù)器端的stub接口以及XDR過(guò)程( rpc生成)。8、在遠(yuǎn)程機(jī)器上啟動(dòng)服務(wù)器,接著在本機(jī)上啟動(dòng)客戶(hù)。23RPC編程方法xxx.idlrpcgenxxx_clnt.cC編譯器客戶(hù)應(yīng)用程序客戶(hù)stub接口客戶(hù)xxx.hxxx_xdr.cC編譯器遠(yuǎn)程過(guò)程服務(wù)器stub接口服務(wù)器xxx_svr.c24RPC編程(步驟1)/*square.c*/void main() int ret; ret = square(3

12、); printf(“%d”,ret);int square(int x) return x*x; 25RPC編程(步驟2)/*square.c*/void main() int ret; ret = square(3); printf(“%d”,ret);/*square_srp.c*/int square(int x) return x*x; 26RPC編程(步驟3)/*rsquare.idl*/program SQUAREPROG version SQUAREVERS int square(int)=1; =1;=0 x30090900;27RPC編程(步驟4)rpcgen square

13、.idl生成四個(gè)文件:square.h、square_clnt.c、square_svc.c和square_xdr.c。28/*square.h*/#define SQUAREPROG 0 x30090900#define SQUAREVERS 1#define square 1extern int * square_1(int *inarg_ptr, CLIENT *clnt); /clients stubextern int * square_1_svc(int *, struct svc_req *rqstp); /servers stub29/* square_clnt.c*/stat

14、ic struct timeval TIMEOUT = 25, 0 ;int* square_1(int *argp, CLIENT * clnt)static int clnt_res;memset(char *)&clnt_res, 0, sizeof (clnt_res);if (clnt_call(clnt, square,/過(guò)程號(hào):1(xdrproc_t) xdr_int, (caddr_t) argp,(xdrproc_t) xdr_int, (caddr_t) &clnt_res,TIMEOUT) != RPC_SUCCESS) return (NULL);return (&cl

15、nt_res);30clnt_call,遠(yuǎn)程過(guò)程調(diào)用函數(shù)。參數(shù)說(shuō)明:clnt, 遠(yuǎn)程調(diào)用句柄square,服務(wù)函數(shù)xdr_int,輸入?yún)?shù)編碼例程argp,輸入?yún)?shù)地址xdr_int,輸出參數(shù)編碼例程clnt_res,輸出參數(shù)地址31/* square_svr.c*/static void squareprog_1(rqstp, transp)/服務(wù)守護(hù)過(guò)程struct svc_req *rqstp;register SVCXPRT *transp;union int square_1_arg; argument;int *result;32 switch (rqstp-rq_proc) ca

16、se square: /過(guò)程號(hào):1 memset(char *)&argument, 0, sizeof (argument); svc_getargs(transp, xdr_int, (caddr_t) &argument); result = square_1_svc(&argument, rqstp); svc_sendreply(transp, xdr_int, result); break; return;33main() SVCXPRT *transp; transp = svcudp_create(RPC_ANYSOCK); if (!svc_register(transp,

17、SQUAREPROG, SQUAREVERS, squareprog_1, IPPROTO_UDP) fprintf(stderr, unable to register (SQUAREPROG, SQUAREVERS, udp);exit(1); transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (!svc_register(transp, SQUAREPROG, SQUAREVERS, squareprog_1, IPPROTO_TCP) fprintf(stderr,unable to register (SQUAREPROG, SQUAREVE

18、RS, tcp);exit(1); 34svcudp_create/svctcp_create在udp或者tcp協(xié)議上建立服務(wù)svc_register將守衛(wèi)過(guò)程注冊(cè)SQUAREPROG, SQUAREVERS,為遠(yuǎn)程服務(wù)提供者的服務(wù)名和版本squareprog_1,為接收到rpc調(diào)用請(qǐng)求時(shí),轉(zhuǎn)到的守衛(wèi)過(guò)程名守衛(wèi)過(guò)程struct svc_req *rqstp;里面包含了請(qǐng)求調(diào)用的函數(shù)名通過(guò)svc_getargs、svc_sendreply函數(shù)來(lái)接收參數(shù)和返回運(yùn)行結(jié)果。35RPC編程(步驟5)/*square_cif.c*/extern CLIENT *handle;static int *ret

19、;int square(int x) int *arg; arg=&x; ret=square_1(arg,handle); return ret=0?-1:*ret;36/*square_sif.c*/static int retcode;int square_1_svc(int *arg,struct svc_req* rqstp) retcode = square(*arg); return retcode;37RPC編程(步驟6)/*square.c*/#define RMACHINE “202.115.30.151”CLIENT *handle;int square(int x);v

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論