RPC のしくみ

RPC ツールを使用すると、クライアントがリモート サーバー プログラムにあるプロシージャを直接呼び出すかのようにユーザーに表示されます。 クライアントとサーバーにはそれぞれ独自のアドレス空間があります。つまり、それぞれには、プロシージャで使用されるデータに割り当てられた独自のメモリ リソースがあります。 次の図は、RPC アーキテクチャを示しています。

rpc アーキテクチャ

図に示すように、クライアント アプリケーションは、プロシージャを実装する実際のコードではなく、ローカル スタブ プロシージャを呼び出します。 スタブはコンパイルされ、クライアント アプリケーションとリンクされます。 リモート プロシージャを実装する実際のコードを格納する代わりに、クライアント スタブ コードは次のようになります。

  • クライアント アドレス空間から必要なパラメーターを取得します。
  • 必要に応じてパラメーターを、ネットワーク経由で送信するための標準の NDR 形式に変換します。
  • RPC クライアント ランタイム ライブラリの関数を呼び出して、要求とそのパラメーターをサーバーに送信します。

サーバーは、リモート プロシージャを呼び出すために次の手順を実行します。

  1. サーバー RPC ランタイム ライブラリ関数は要求を受け入れ、サーバー スタブ プロシージャを呼び出します。
  2. サーバー スタブは、ネットワーク バッファーからパラメーターを取得し、それらをネットワーク転送形式からサーバーに必要な形式に変換します。
  3. サーバー スタブは、サーバー上の実際のプロシージャを呼び出します。

その後、リモート プロシージャが実行され、出力パラメーターと戻り値が生成される可能性があります。 リモート プロシージャが完了すると、同様の一連の手順でデータがクライアントに返されます。

  1. リモート プロシージャは、そのデータをサーバー スタブに返します。
  2. サーバー スタブは、出力パラメーターをネットワーク経由での送信に必要な形式に変換し、RPC ランタイム ライブラリ関数に返します。
  3. サーバー RPC ランタイム ライブラリ関数は、ネットワーク上のデータをクライアント コンピューターに送信します。

クライアントは、ネットワーク経由でデータを受け入れ、呼び出し元の関数に返すことによって、プロセスを完了します。

  1. クライアント RPC ランタイム ライブラリは、リモート プロシージャの戻り値を受け取り、クライアント スタブに返します。
  2. クライアント スタブは、データを NDR からクライアント コンピューターで使用される形式に変換します。 スタブはクライアント メモリにデータを書き込み、その結果をクライアントの呼び出し元プログラムに返します。
  3. 呼び出し元のプロシージャは、同じコンピューターでプロシージャが呼び出されたかのように続行されます。

ランタイム ライブラリは、アプリケーションとリンクされたインポート ライブラリと、ダイナミック リンク ライブラリ (DLL) として実装される RPC ランタイム ライブラリの 2 つの部分で提供されます。

サーバー アプリケーションには、サーバーのインターフェイスを登録し、サーバーがリモート プロシージャ 呼び出しを受け入れることを許可するサーバー ランタイム ライブラリ関数の呼び出しが含まれています。 サーバー アプリケーションには、クライアント アプリケーションによって呼び出されるアプリケーション固有のリモート プロシージャも含まれています。