TCP/IP 與 Internet 網路:第九章 RPC 高階程式介面 上一頁 下一頁
9-8 XDR 資料表示協
在執行遠端程序呼叫時,也許會跨越不同型態電腦來執行程序呼叫。不同型態的主機電腦或作業系統,對於『抽象資料型態』(Abstract Data Type)的表示法也許會有所不同,遠端程序呼叫之間所傳遞參數的表示數值,容易造成嚴重的錯誤,因此,在傳遞參數之前必需給予一種標準表示法,而接收端也以標準表示法來讀取參數,才能使傳遞訊息達到一致性。早期 Sun 公司就採用『外部資料表示法』(eXternal Data Representation, XDR),將其崁入遠端程序呼叫內,來解決抽象資料表示不同的問題。
首先我們來探討不同電腦系統之間,抽象資料表示有可能發生哪些問題:
(1) 資料長度:一般宣告變數時都會給一個記憶體空間以供儲存,至於記憶體空間大小是由資料型態來決定。但對於不同電腦系統來說,針對某一資料型態給予的空間大小不一定相同。譬如,某一部電腦(主機_A)宣告一個整數給於 16 位元空間儲存,而其它電腦(主機_B)可能給予 32 位元空間。當主機_A 呼叫主機_B 上的程序,而攜帶一個整數參數(16 位元),主機_B 接收參數時便無法辨識該內容。
(2) 位元組順序:位元組的順序在不同電腦系統之間也許會不一樣,有的電腦最高位元在最右邊(Intel CPU),然而有的是在最左邊(Motorola CPU)。如果之間沒有特殊轉換,那麼傳遞參數將會發生嚴重的錯誤。
(3) 資料表示:對於各種資料表示法也可能不同。譬如,帶符號的數值大小中,其數值是 2 的補數或 1 的補數;或浮點運算資料中,數值和指數大小的表示;或對於空值(Null)的表示,這些在不同電腦之間都有很大的差異。
(4) 序列(Alignment):如果一個變數超過一個位元組,而必須使用兩個以上的位元組表示時,低位元組是在高或低記憶體位址,這在不同電腦之間表示也不一樣。譬如表示一個兩位元組的數值,Motorola CPU 以低記憶體位址放置較高的位元組;而 Intel CPU 則相反。
XDR 定義一種標準表示法,傳送端欲將資料傳送之前,先將其轉換成 XDR 表示法,接收端收到訊息時,再將資料轉換成自己的資料表示法,這樣雙方傳送資料就不會發生認定資料內容的錯誤。如圖 9-7 中,XDR 定義整數都以 32 位元長度表示(長整數或短整數),而且使用 2 的補數、最高位元是最左邊的位元、最低位元是最右邊位元,而客戶端是以 16 位元表示短整數(int),長整數以 32 位元表示。伺服端也都以 32 位元表示長整數和短整數。當客戶端和伺服端之間資料格式,就利用 XDR 來轉換。
圖 9-7 XDR 表示範例
我們使用 rpcgen 編譯規格檔時,它會依照規格檔裡所宣告的傳遞參數,產生一個 XDR 資料格式轉換檔,副檔名為『.xdr』。編譯客戶端主程式或伺服端程序時,只要將該檔案連結進去即可。但如果編寫較低階的遠端程序(不使用 rpcgen),則必須自行規劃 XDR 檔案,至於如何編寫 XDR 檔案,留給讀者自行探討或請參考其它書本。