TCP/IP 與 Internet 網路:第九章 RPC 高階程式介面  上一頁           下一頁

 

翻轉工作室:粘添壽

 

9-4 RPC 程式開發

欲開發一個 RPC 程式,首先必須將一些遠端程序組合一個程式,它的做法是設定一個程式,並給予一個『程式號碼』(Program Number來作為識別,一個程式號碼包含若干個程式版本,每一程式版本也給予一個『版本號碼』(Version Number以作為識別,同樣的,每一版本號碼也包含若干個遠端程序,每一遠端程序也給予一個『程序號碼』(Procedure Number來作為識別。這表示程式號碼定義一組程序,版本號碼讓使用者隨時擴充程式功能,而程序號碼描述程式內的程序。

然而 RPC 程式是一個高階程式介面,當我們開發 RPC 程式時,有關低階介面(如 Socket)的處理程序必需儘量去簡化它。早期 Sun 為了簡化程式設計,開發一個 RPC 程式的產生器,稱之為rpcgenrcpgen 的規範為 RFC 1057(新的工具為 new-rpcgen 功能比 rpcgen 強),它提供一系列的規格檔(Specification File)格式(9-7 節介紹)。規格檔經過 rpcgen 編譯後,會自動產生『伺服基礎檔』(Server Stub『客戶基礎檔』(Client Stub,並依照選項(Option)來產生認證(Authentication)交換檔和資料表示檔(XDR)(RFC 1014)。客戶端和伺服端程式只要連結這些檔案,就不需要考慮有關下層連接介面和資料格式的表示法。因此,我們可將 rpcgen 的功能歸類如下:

rpcgen 是一個編譯程式(Compiler),它可依照規格檔來定義遠端程序呼叫的介面,並產生伺服端和客戶端的基礎檔。

可照選項來決定是否包含共通資料表示法(XDR)和認證系統(Kerberos)。

並連結相關 RPC 庫存函數(RPC Library)。

我們用圖 9-6 來說明發展 RPC 程式的過程,如以下步驟:

(1) 編寫 RPC 規格檔:規格檔中描述伺服程式和客戶程式之間的交換資料格式,以及呼叫程序的名稱,並指定遠端程式號碼與程式版本(如 math.x)。規格檔的編寫格式如 9-7 節說明。

(2) 利用 rpcgen 編譯程式產生四個共用檔案:標頭檔(math.h)、Server Stubmath_svc.c)、Client Stubmath_clnt.c 與資料格式轉換檔(math_xdr.c)。Server Stub Client Stub 兩個檔案一般都不希望使用者去更改它,而只當作編譯時連結使用。標頭檔內定義有關程序呼叫的參數格式和程序名稱,一般也不希望使用者更改,作為遠端程序和客戶端程式原始檔的包含檔(Include File)使用。不同主機上的客戶端程式,如想要呼叫該遠端程序,都必須要依此前頭檔來編寫程式,因此必須將其複製到不同的客戶端電腦上。rpcgen 的命令格式如下:(以 math.x 為範例)

$ rpcgen math.x

(3) 編寫遠端程序:必須將共通前頭檔加入(如,#include <math.h>),並依照遠端程序功能編寫程式。編譯時必須將 Server Stub 加入,範例如下:(lnsl 中的 l L 的小寫)

$ cc –o math_proc math_proc.c math_svc.c math_xdr.c  –lns1

(4) 編寫客戶端主程式:客戶端也是依照共通標頭檔(如,math.h)編寫所需呼叫程式。編譯時也必須將 Client Stab XDR 檔案加入連結,範例如下:

$ cc –o math_req math_req.c math_clnt.c math_xdr.c  –lns1

(5) 遠端程序執行:在遠端電腦上執行遠端程序,一般都採用幕後執行模式(&),範例如下:(163.15.2.62

$ math_proc  &

(6) 客戶端程序呼叫:在客戶端(163.15.2.30)呼叫遠端程序,譬如,遠端主機位址為 163.15.2.62linux-1),程序有兩個傳遞參數:2050,範例如下:

$ math_req 163.15.2.62  20  50   

$math_req linux-1  20  50 

9-6 RPC 程式開發之功能圖

 

 

<GOTOP>