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