微軟RPC技術學習小結


  RPC,即Remote Procedure Call,遠程過程調用,是進程間通信(IPC, Inter Process Communication)技術的一種。由於這項技術在自己所在項目(Windows產品)中使用很多,因此周末學習總結一下。這里研究的主要是微軟的RPC技術。

  程序間的RPC通信既可以在同一台計算機,或者同一個本地網絡,也可以是互聯網兩台機器間,因此在分布式計算環境中應用很廣RPC采用客戶機/服務器(C/S)模式,客戶機負責發送請求,服務器響應請求,返回客戶機請求的數據,達到通信的目的。通過在項目代碼中的學習,我的理解是客戶機和服務器共同維護一個命令列表,程序員開發時新建一條命令,發送請求時命令作為第一個參數,服務器通過命令來調用正確的處理程序,返回客戶機需要的信息。

  學習RPC首先要明確幾個概念: 

  一. RPC概念學習

  1. Client(客戶機)

    一個進程,可以是一個程序或任務,用來請求服務,發送RPC請求(可以是同步,指客戶機程序一直hang在那里,等待服務器的響應,也可以是異步方式,即不會等待,繼續向下執行代碼)到服務器,這里的RPC服務由微軟windows的Services提供,我們不需要了解細節。

  2. Server(服務器)

    一個進程,可以是一個程序或任務,用來響應服務,接收RPC請求,並作出響應。

  3. EndPoint(端點)

    可以是一個端口,或者一組端口,由Server的RPC Services監聽(Listen),以便實時監聽到客戶機發出的請求。

  4. Client Stub(不知該如何翻譯。。)

    客戶端程序中的一個模塊,負責調用marshalling engine(提供了Client和Server的公共RPC接口,有NDR20和NDR64兩種,win32程序使用NDR20,x64程序使用NDR64,Client和Server選擇其中一種使用)和一些其他RPC API。

  5. Server Stub(同上)

    有Client Stub,就會有Server Stub,同樣是Server的一個模塊,通過本地過程調用( local procedure calls)來處理收到的遠程請求。

  

  二. 一個完整的RPC通信過程

   RPC Process

               圖一

  通信從客戶端發起請求開始,客戶端程序發送請求時調用Client Stub,Client Stub拿到請求的參數並把信息推送到Client Runtime Library,Client Runtime Library負責將參數轉換成標准的網絡參數(Network Data Representation,簡稱NDR,即通過marshalling engine(NDR20或者NDR64)轉換),並通過程序發送至服務器,服務器程序監聽端口,拿到請求后,發出響應,客戶機程序得到響應,具體可參加圖一。

  

  三. RPC技術架構

    RPC Architecture

 

               圖二

  上圖是RPC的技術架構圖,來源於微軟的技術社區,通過上圖,可以較清楚的看到RPC過程中涉及的組件和技術。其中Local RPC只適用於客戶端程序和服務器程序位於同一台機器時。另外RPC技術發送Local請求時使用ncalrpc協議,發送Remote請求時使用ncacn_ip_tcp或者ncacn_np協議,前者微軟更推薦。

  

  四. 總結

  目前自己對於RPC的學習與理解是這樣,本來想實現一個小的例子,但是微軟提供的Sample目前還沒找到(在win7 sdk中有),如果有時間,一定實現一個例子,讓學習總結更深刻些。(PS:由於本人懶惰,RPC的學習本應在幾天前完成,但一直拖到周末,今后要克服拖延的毛病)。

  由於學習時間較短,文中內容主要參考微軟技術文檔,若有理解不當之處,請大家指正:-)

  

  五. 參考資料

  1. RPC Technical Reference

    http://technet.microsoft.com/en-us/library/cc787851(v=ws.10).aspx

  2. Microsoft RPC Model

    http://msdn.microsoft.com/en-us/library/aa374172(v=vs.85).aspx

  3. RPC編程

    http://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/#ibm-pcon

 

  Best Regards

  Kevin Song 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM