中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        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ò) 收藏

        過(guò)程調(diào)用的類型定義如下。_TYPE_SIMPLE_WRITEREAD是簡(jiǎn)單的讀寫,輸入?yún)?shù)和輸出參數(shù)都在頭信息和過(guò)程的參數(shù)數(shù)據(jù)結(jié)構(gòu)中。_TYPE_READ指返回結(jié)果保存在單獨(dú)的內(nèi)存。_TYPE_WRITE指寫信息保存在單獨(dú)的內(nèi)存。RPC_TYPE_WRITE_READ調(diào)用是需要內(nèi)存保存輸入數(shù)據(jù),返回時(shí)需要保存輸出的結(jié)果。
        f.JPG
        每個(gè)過(guò)程定義自己的輸入輸出參數(shù)結(jié)構(gòu)。例如對(duì)獲取串口狀態(tài)GetCommState過(guò)程,建立RPC_GETCOMMSTATE結(jié)構(gòu)。
        h.JPG
        由于各個(gè)編譯器對(duì)struct數(shù)據(jù)結(jié)構(gòu)的成員的對(duì)齊不同。這樣同樣的struct在客戶端和服務(wù)器端的大小可能不同,同樣的成員在結(jié)構(gòu)中的位置不同。為了確??蛻舳撕头?wù)器端有相同的對(duì)齊,我們采用字節(jié)對(duì)齊用#pragma pack(1)。
        3.2 Packet內(nèi)存布局
        開(kāi)始依次是頭信息和參數(shù),其余部分根據(jù)特定的過(guò)程而不同。以RPC_TYPE_WRITE_READ類型的布局為例:頭信息,參數(shù),輸入內(nèi)存塊[1…N],輸出內(nèi)存塊[1…N]。其他的過(guò)程類型布局類似。
        3.3 服務(wù)器端
        3.3.1 網(wǎng)絡(luò)模塊
        RPC在單獨(dú)的任務(wù)中執(zhí)行。圖5為RPC任務(wù)流程圖。調(diào)用VxWorks的系統(tǒng)函數(shù)taskSpawn建立RPC任務(wù)。調(diào)用socket( )建立面向連接的SOCK_ STREAM套接字,bind將套接字與本地網(wǎng)絡(luò)地址和端口號(hào)捆綁,listen申明要在該端口偵聽(tīng)客戶連接請(qǐng)求,accept阻塞等待請(qǐng)求的到來(lái)。

        本文引用地址:http://www.antipu.com.cn/article/150615.htm

        h.JPG


        3.3.2 狀態(tài)機(jī)實(shí)現(xiàn)
        當(dāng)accept后,進(jìn)入服務(wù)器端狀態(tài)機(jī)。設(shè)置accept返回的socket為非阻塞狀態(tài)。在阻塞的socket上調(diào)用send時(shí),如果沒(méi)有足夠的輸出緩沖區(qū),該調(diào)用將被阻塞。Recv也是一樣,要讀的數(shù)據(jù)沒(méi)有就緒時(shí),調(diào)用者阻塞。服務(wù)器不知道每次要讀取的字節(jié)數(shù),所以阻塞的socket無(wú)法工作。
        分配2塊內(nèi)存:A和B。內(nèi)存A用來(lái)保存recv的內(nèi)容,內(nèi)存B用來(lái)保存客戶端發(fā)送的Packet內(nèi)容。因?yàn)榉?wù)器不知道客戶會(huì)發(fā)送多大的內(nèi)容過(guò)來(lái),每次從內(nèi)存A拷貝到內(nèi)存B之前檢查內(nèi)存B的大小,如果內(nèi)存B剩余大小不夠則重新分配。
        在得到了整個(gè)Packet后,即GetComplatePacket后,根據(jù)dwCallID調(diào)用服務(wù)器的本地過(guò)程,待返回后將返回值和內(nèi)存打包發(fā)送給客戶端。
        3.4 客戶端實(shí)現(xiàn)
        客戶端的流程如圖6所示。在Windows下運(yùn)行,首先調(diào)用WSAStartup,Windows根據(jù)請(qǐng)求的Socket版本來(lái)搜索相應(yīng)的Socket庫(kù),然后綁定找到的Socket庫(kù)到該應(yīng)用程序中。然后初始化socket,連接到服務(wù)器,接著過(guò)程調(diào)用。比如過(guò)程調(diào)用1會(huì)進(jìn)入圖4狀態(tài)機(jī)。狀態(tài)機(jī)和服務(wù)器端類似,只是首先參數(shù)打包,發(fā)送給服務(wù)器,返回后拆包并拷貝返回信息到內(nèi)存中。

        i.JPG



        4 結(jié)束語(yǔ)
        本文和實(shí)現(xiàn)的RPC可應(yīng)用于白盒測(cè)試、跨平臺(tái)開(kāi)發(fā)環(huán)境和開(kāi)發(fā)客戶端軟件等。商用的IDE軟件都很昂貴,通過(guò)本RPC,測(cè)試人員就可用開(kāi)源的環(huán)境如cygwin等開(kāi)發(fā)白盒測(cè)試代碼。另外對(duì)于有大量操作界面的開(kāi)發(fā),需要頻繁下載到開(kāi)發(fā)板上驗(yàn)證,本文RPC可應(yīng)用于構(gòu)建跨平臺(tái)的開(kāi)發(fā)環(huán)境,直接在Windows上開(kāi)發(fā)界面部分,最后下載到開(kāi)發(fā)板上,從而大大提高開(kāi)發(fā)效率。大多數(shù)的軟件都有相應(yīng)的PC客戶端軟件,本文的實(shí)現(xiàn)也適用于開(kāi)發(fā)PC客戶端軟件。

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

        上一頁(yè) 1 2 3 下一頁(yè)

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉