新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種嵌入式RPC的設(shè)計(jì)與實(shí)現(xiàn)

一種嵌入式RPC的設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2011-06-10 來(lái)源:網(wǎng)絡(luò) 收藏

1.4 Sun
Sun 有時(shí)也稱(chēng)為ONC(Open Network Computing)。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,注冊(cè)端口和監(jiān)聽(tīng),接受連接,拆參數(shù),調(diào)用實(shí)際的過(guò)程,打包返回值。client stub則是打包參數(shù),發(fā)送給server,將返回值解包。Sun RPC缺點(diǎn)就是對(duì)Windows沒(méi)有很好的支持。

2
與傳統(tǒng)的模型不同,服務(wù)器端分為:網(wǎng)絡(luò)通訊,接收狀態(tài)機(jī)和過(guò)程處理。客戶端分為網(wǎng)絡(luò)通訊,發(fā)送狀態(tài)機(jī)和過(guò)程調(diào)用。
圖3是服務(wù)器端的狀態(tài)機(jī)。服務(wù)器進(jìn)程從初始狀態(tài)進(jìn)入GetHeader狀態(tài)。GetHeader是讀取遠(yuǎn)程過(guò)程調(diào)用的頭信息。如果一次得到了所有數(shù)據(jù),也就是nCurLen>=dwTotalSize,則進(jìn)入GetComplatePacket狀態(tài),反之進(jìn)入GetData狀態(tài)。GetData是讀取參數(shù)數(shù)據(jù),讀取數(shù)據(jù)直到得到所有的數(shù)據(jù)進(jìn)入GetComplatePacket狀態(tài)。期間如果超時(shí),則回到GetHeader狀態(tài)。超時(shí)的起始時(shí)間從GetHeader韻第一個(gè)字節(jié)算起,如果在定義的時(shí)間無(wú)法讀取dwTotalSize個(gè)字節(jié),則Timeout從而回到GetHeader狀態(tài)。在GetHeader和GetData時(shí),如果讀取數(shù)據(jù)有錯(cuò)誤(如客戶端斷開(kāi)連接,recv函數(shù)返回錯(cuò)誤)則狀態(tài)機(jī)退出。GetComplatePacket是得到了完整的包。CheckCall判斷當(dāng)前的調(diào)用是否是有效的過(guò)程調(diào)用。如果無(wú)效則進(jìn)入狀態(tài),并回復(fù)無(wú)效命令給客戶端,最后進(jìn)入GetHeader狀態(tài)。如果有效,則處理此調(diào)用,最后發(fā)送結(jié)果給客戶端。

本文引用地址:http://butianyuan.cn/article/150615.htm

c.JPG d.JPG


圖4為客戶端狀態(tài)機(jī)。首先是打包參數(shù),發(fā)送到服務(wù)器端,等待服務(wù)器端的回復(fù),進(jìn)入GetHeader狀態(tài)。GetHeader,GetData和Get Com-plate Packet與服務(wù)器相應(yīng)的狀態(tài)意義相同。如果timeout則返回timeout錯(cuò)誤。如果得到了整個(gè)packet則拆分最后返回。
DCE—RPC和ONC—RPC允許選擇UDP或TCP協(xié)議。TCP協(xié)議傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。UDP協(xié)議不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地?;赥CP協(xié)議的可靠性,選擇TCP作為通訊協(xié)議。
3
3.1 數(shù)據(jù)結(jié)構(gòu)
服務(wù)器和客戶用共用包頭信息和每個(gè)過(guò)程的參數(shù)結(jié)構(gòu)。頭信息定義如下。dwCallID是過(guò)程的標(biāo)識(shí)號(hào)。每個(gè)過(guò)程都有一個(gè)唯一的號(hào)碼。bCallType是調(diào)用的類(lèi)型。dwTotalSize是整包的字節(jié)數(shù)。dwReturn是返回結(jié)果。
e.JPG

linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉