近期課程的作業需要用到RPC程式設計,除了課堂上學到的知識,還得親自動手。打算先寫個簡單的HelloWorld練習一下,順便複習一下學到的知識。
RPC意為遠端過程呼叫協議(Remote Procedure Call Protocol)。編制好單機應用程式,然後劃分為兩個或多個程式片,加入通訊協議使得每片可以在單獨的計算機上執行。從一個程式片呼叫另一個程式片的過程稱為遠端過程呼叫,即RPC。它是一個C/S模型,呼叫程式稱為rpc client,被呼叫程式片稱為rpc server。
對於RPC的程式設計過程可以簡化如下:
1.構建解決問題的常規應用程式;
2.選擇一組過程形成遠端程式,以便將遠端程式轉移到遠端機器中,通過這種方法將程式分解;
3.為遠端程式編寫RPC介面(xxx.idl),包括遠端的名字及其編號,還有對其引數的申明,選擇遠端程式號和版本號;
4.執行rpcgen檢查該介面,如果合法,便生成四個原始碼檔案:xxx.h(型別說明檔案)、xxx_XDR.c(XDR轉換例程)、xxx_clnt.c(客戶端的stub)以及xxx_svc.c(服務守護過程,服務端的stub) ,這些檔案將在客戶和伺服器程式中使用;
5.為客戶端和伺服器端編寫stub介面例程;
6.編譯並連結客戶程式。它由四個主要檔案組成:去掉了遠端過程的程式、客戶端的stub(rpc生成)、客戶端的stub介面以及XDR過程( rpc生成)。
7.編譯並連結伺服器程式。它由四個主要檔案組成:遠端過程組成的程式、伺服器的stub(rpc生成)、伺服器端的stub介面以及XDR過程( rpc生成)。
8.在遠端機器上啟動伺服器,接著在本機上啟動客戶。
簡單來講,需要做的主要工作就是編寫應用程式並分片,編寫介面(規格說明檔案),編寫stub介面例程,編寫主函式。通訊協議的實現和XDR資料格式的統一交給rpcgen完成,它會自動生成相關的程式碼。
練習的程式碼的參考:http://wenku.baidu.com/view/58e19446b307e87101f696c6.html這個程式的目的是客戶端接收一個引數(設定為HelloWorld),傳送給伺服器,然後伺服器顯示自己的提示資訊和客戶端發來的資訊。
除錯不是很順利,最開始時遇到了提示:Cannot register service: RPC: Unable to receive; errno = Connection refused。上網搜尋得知,是因為伺服器沒有開啟埠對映的功能,開啟portmap就可以了。
sudo /etc/init.d/portmap restart
當然,我的Linux虛擬機器沒有安裝portmap,需要安裝。執行下面的命令:
當然,我的Linux虛擬機器沒有安裝portmap,需要安裝。執行下面的命令:
sudo apt-get install portmap
此時仍然報錯:Cannot register service: RPC: Authentication error; why = Client credential too weak。這個看著百思不得其解,因為引數設定不是按照參考程式碼就是自動生成的(只有program編號是根據劃分規則修改的),完全不知道錯在哪裡,查了很多資料也一頭霧水。最後看到了一項搜尋結果的預覽(點選檢視),提到了Fedora7出現這種問題改成超級使用者即可。雖然現在虛擬機器裡用的是Ubuntu11.10,不過還是在執行編譯好的檔案前加了個sudo。輸完密碼果然顯示需要的結果,這個小練習可以告一段落了。