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

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