RPC 的運作方式
RPC 工具會讓使用者看起來就像用戶端直接呼叫位於遠端伺服器程式中的程式一樣。 用戶端和伺服器各有自己的地址空間;也就是說,每個都有自己的記憶體資源,這些資源是分配給用於程序的數據的。 下圖說明 RPC 架構。
如圖所示,用戶端應用程式會呼叫本機存根程式,而不是實作程式的實際程序代碼。 存根會被編譯,然後與用戶端應用程式連結。 相較於包含實作遠端程式的實際程式碼,用戶端存根程式碼:
- 從用戶端位址空間擷取必要的參數。
- 視需要將參數轉譯為標準 NDR 格式,以便透過網路傳輸。
- 呼叫 RPC 用戶端運行時間連結庫中的函式,以將要求及其參數傳送至伺服器。
伺服器會執行下列步驟來呼叫遠端程式。
- 伺服器 RPC 執行階段函式庫接受要求,並呼叫伺服器存根程序。
- 伺服器存根會從網路緩衝區擷取參數,並將其從網路傳輸格式轉換成伺服器所需的格式。
- 伺服器存根會呼叫伺服器上的實際程式。
然後,遠端程式會執行,可能會產生輸出參數和傳回值。 當遠端程式完成時,類似的步驟順序會將數據傳回用戶端。
- 遠端程式會將其數據傳回至伺服器存根。
- 伺服器存根會將輸出參數轉換成透過網路傳輸所需的格式,並將其傳回至 RPC 執行時間連結庫函式。
- 伺服器 RPC 運行時程式庫函式會將網路上的資料傳輸到用戶端電腦。
用戶端會透過網路接受數據,並將其傳回給呼叫函式,以完成此程式。
- 用戶端 RPC 執行時間連結庫會接收遠端程式傳回值,並將其傳回至用戶端存根。
- 用戶端存根會將數據從其 NDR 轉換成用戶端電腦所使用的格式。 存根會將數據寫入用戶端記憶體,並將結果傳回用戶端上的呼叫程式。
- 呼叫程式會繼續,就像在同一部計算機上呼叫程式一樣。
運行時間連結庫提供兩個部分:匯入連結庫,此連結庫會與應用程序連結,而 RPC 執行時間連結庫會實作為動態連結庫 (DLL)。
伺服器應用程式包含對伺服器執行時期函式庫的呼叫,這些函式會註冊伺服器的介面,並允許伺服器接受遠端過程調用。 伺服器應用程式也包含用戶端應用程式所呼叫的應用程式特定遠端程式。