portmap プログラムは、RPC プログラムとバージョン番号を、トランスポート固有のポート番号にマップします。portmap プログラムは、遠隔プログラムの動的結合を可能にします。
図 E-1 は、次の処理を示しています。
サーバーが portmap に登録する
クライアントは、サーバーのポートを portmap から得る
クライアントが、サーバーを呼び出す
予約ポート番号は少ないのに対して、遠隔プログラム数は非常に多くなる可能性があります。したがって、よく知られたポートでポートマッパを実行しておけば、その他の遠隔プログラムのポート番号はポートマッパに問い合わせることによって得られます。図 E-1 では a、111、b、c はポート番号を表しています。111 はポートマッパに割り当てられたポート番号です。
ポートマッパはブロードキャスト RPC にも役立ちます。特定の RPC プログラムは、マシンが異なると通常別のポート番号に結合されるので、直接これらすべてのプログラムにブロードキャストする方法はありません。これに対して、ポートマッパは固定のポート番号を持っています。そこで、特定のプログラムにブロードキャストするには、クライアントはブロードキャストアドレスにあるポートマッパにメッセージを送信します。各ポートマッパは、ブロードキャストを受けて、クライアントが指定しているローカルサービスを呼び出します。portmap はローカルサービスからの応答を取り出すと、それをクライアントに送信します。portmap プロトコル仕様は、例 E-1 に示します。
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; |