一種嵌入式RPC的設計與實現
1.4 SunRPC
Sun RPC有時也稱為ONC(Open Network Computing)RPC。Sun RPC提供了一個接口語言IDL和rpcgen用于C語言支持。這門語言可以定義constants,typedef,structure,union。rpcgen可以產生server code,client stub和頭文件。server code主要是建立socket,注冊端口和監聽,接受連接,拆參數,調用實際的過程,打包返回值。client stub則是打包參數,發送給server,將返回值解包。Sun RPC缺點就是對Windows沒有很好的支持。
2 設計
本設計與傳統的模型不同,服務器端分為:網絡通訊,接收狀態機和過程處理。客戶端分為網絡通訊,發送狀態機和過程調用。
圖3是服務器端的狀態機。服務器進程從初始狀態進入GetHeader狀態。GetHeader是讀取遠程過程調用的頭信息。如果一次得到了所有數據,也就是nCurLen>=dwTotalSize,則進入GetComplatePacket狀態,反之進入GetData狀態。GetData是讀取參數數據,讀取數據直到得到所有的數據進入GetComplatePacket狀態。期間如果超時,則回到GetHeader狀態。超時的起始時間從GetHeader韻第一個字節算起,如果在定義的時間無法讀取dwTotalSize個字節,則Timeout從而回到GetHeader狀態。在GetHeader和GetData時,如果讀取數據有錯誤(如客戶端斷開連接,recv函數返回錯誤)則狀態機退出。GetComplatePacket是得到了完整的包。CheckCall判斷當前的調用是否是有效的過程調用。如果無效則進入狀態,并回復無效命令給客戶端,最后進入GetHeader狀態。如果有效,則處理此調用,最后發送結果給客戶端。本文引用地址:http://www.j9360.com/article/150615.htm
圖4為客戶端狀態機。首先是打包參數,發送到服務器端,等待服務器端的回復,進入GetHeader狀態。GetHeader,GetData和Get Com-plate Packet與服務器相應的狀態意義相同。如果timeout則返回timeout錯誤。如果得到了整個packet則拆分最后返回。
DCE—RPC和ONC—RPC允許選擇UDP或TCP協議。TCP協議傳輸控制協議,提供的是面向連接、可靠的字節流服務。UDP協議不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是并不能保證它們能到達目的地。基于TCP協議的可靠性,選擇TCP作為通訊協議。
3 實現
3.1 數據結構
服務器和客戶用共用包頭信息和每個過程的參數結構。頭信息定義如下。dwCallID是過程的標識號。每個過程都有一個唯一的號碼。bCallType是調用的類型。dwTotalSize是整包的字節數。dwReturn是返回結果。
評論