ONC+ 開発ガイド

portmap プロトコル

portmap プログラムは、RPC プログラムとバージョン番号を、トランスポート固有のポート番号にマップします。portmap プログラムは、リモートプログラムの動的結合を可能にします。

図 E–1 典型的な Portmap シーケンス (TCP/IP のみ)

Graphic

上記の図は、次のプロセスを示しています。

  1. サーバーが portmap に登録する

  2. クライアントは、サーバーのポートを portmap から得る

  3. クライアントが、サーバーを呼び出す

予約ポート番号は少ないのに対して、リモートプログラム数は非常に多くなる可能性があります。したがって、よく知られたポートでポートマッパーを実行しておけば、その他のリモートプログラムのポート番号はポートマッパーに問い合わせることによって得られます。図 E–1 では、 a111bc はポート番号を表し、111 はポートマッパーに割り当てられたポート番号です。

ポートマッパーはブロードキャスト RPC にも役立ちます。特定の RPC プログラムは通常、異なるマシンへは異なるポート番号を割り当てるため、これらのすべてのプログラムへ直接ブロードキャスト通信を行うことはできません。これに対して、ポートマッパーは固定のポート番号を持っています。そこで、特定のプログラムにブロードキャストするには、クライアントはブロードキャストアドレスにあるポートマッパーにメッセージを送信します。各ポートマッパーは、ブロードキャストを受けて、クライアントが指定しているローカルサービスを呼び出します。portmap はローカルサービスからの応答を取り出すと、それをクライアントに送信します。次のコーディング例で、portmap プロトコル仕様を示します。


例 E–1 portmap プロトコル仕様 (RPC 言語で記述)

const PMAP_PORT = 111;       /* ポートマッパーのポート番号 */
 /*
  * ポート番号のマッピング (プログラム、バージョン、プロトコル) 
  */
 struct pmap {
 	rpcprog_t prog;
 	rpcvers_t vers;
 	rpcprot_t prot;
 	rpcport_t port;
 };
 /*
  * prot フィールドに指定できる値
  */
 const IPPROTO_TCP = 6; /* TCP/IP のプロトコル番号*/
 const IPPROTO_UDP = 17; /* UDP/IP のプロトコル番号  */
 /*
  * マッピングのリスト
  */
 struct pmaplist {
 	pmap map;
 	pmaplist *next;
 };
 /*
  * callit への引数
  */
 struct call_args {
 	rpcprog_t prog;
 rpcvers_t vers;
 rpcproc_t proc;
 	opaque args<>;
 };
 /*
 * callit の戻り値
 */
 struct call_result {
 	rpcport_t port;
 	opaque res<>;
 };
 /*
 * ポートマッパー手続き
 */
 program PMAP_PROG {
 	version PMAP_VERS {
 		void
 		PMAPPROC_NULL(void) = 0;
 		bool
 		PMAPPROC_SET(pmap) = 1;
 		bool
 		PMAPPROC_UNSET(pmap) = 2;
 		unsigned int
 		PMAPPROC_GETPORT(pmap) = 3;
 		pmaplist
 		PMAPPROC_DUMP(void) = 4;
 		call_result
 		PMAPPROC_CALLIT(call_args) = 5;
 	} = 2;
 } = 100000;