rpcbind は RPC のプログラム番号とバージョン番号を汎用アドレスにマップし、リモートプログラムの動的結合を可能にします。
rpcbind はそれをサポートしているトランスポートのよく知られたアドレスに結合しています。他のプログラムは、動的に割り当てられたアドレスを rpcbind で登録します。rpcbind は、それらのアドレスを一般に使用できるようにします。汎用アドレスとは、トランスポートに依存したアドレスで、文字列で表現されています。汎用アドレスは、各トランスポートのアドレス管理者が定義します。
rpcbind はブロードキャスト RPC にも利用できます。RPC プログラムでは、マシンが異なる場合、アドレスも異なるため、これらのプログラムすべてに直接ブロードキャスト通信を行うことは不可能です。ところが、rpcbind のアドレスはわかっています。 そのため、特定のプログラムへブロードキャスト通信を行うには、クライアントは送信先マシン上にある rpcbind プロセスへメッセージを送信します。 rpcbind はブロードキャストメッセージを取り出し、クライアントが指定したローカルサービスを呼び出します。rpcbind はローカルサービスからの応答を取り出すと、それをクライアントに送信します。
次のコーディング例は、RPC 言語の rpcbind プロトコル仕様を示します。
/*
* rpcb_prot.x
* rpc 言語で記述した RPCBIND プロトコル
*/
/*
* (プログラム、バージョン、ネットワーク ID) の汎用アドレスへの割り当て
*/
struct rpcb {
rpcproc_t r_prog; /* プログラム番号 */
rpcvers_t r_vers; /* バージョン番号 */
string r_netid<>; /* ネットワーク ID */
string r_addr<>; /* 汎用アドレス */
string r_owner<>; /* このサービスの所有者 */ };
/* 割り当てのリスト */
struct rpcblist {
rpcb rpcb_map;
struct rpcblist *rpcb_next;
};
/* リモート呼び出しの引数 */
struct rpcb_rmtcallargs {
rpcprog_t prog; /* プログラム番号 */
rpcvers_t vers; /* バージョン番号 */
rpcproc_t proc; /* 手続き番号 */
opaque args<>; /* 引数 */
};
/* リモート呼び出しの戻り値 */
struct rpcb_rmtcallres {
string addr<>; /* リモート汎用アドレス */
opaque results<>; /* 戻り値 */
};
/*
* rpcb_entry には、特定のトランスポート上のサービスの
* マージされたアドレスと関連付けられた netconfig 情報を含みます。
* RPCBPROC_GETADDRLIST は rpcb_entry のリストを返します。
* r_nc_* フィールドで使用できる値については、netconfig.h を
* 参照してください。
*/
struct rpcb_entry {
string r_maddr<>; /* サービスのマージされたアドレス */
string r_nc_netid<>; /* netid フィールド */
unsigned int r_nc_semantics; /* トランスポートのセマンティクス */
string r_nc_protofmly<>; /* プロトコルファミリ */
string r_nc_proto<>; /* プロトコル名 */
};
/* サービスがサポートするアドレスのリスト */
struct rpcb_entry_list {
rpcb_entry rpcb_entry_map;
struct rpcb_entry_list *rpcb_entry_next;
};
typedef rpcb_entry_list *rpcb_entry_list_ptr;
/* rpcbind 統計情報 */
const rpcb_highproc_2 = RPCBPROC_CALLIT;
const rpcb_highproc_3 = RPCBPROC_TADDR2UADDR;
const rpcb_highproc_4 = RPCBPROC_GETSTAT;
const RPCBSTAT_HIGHPROC = 13; /* rpcbind V4 内の手続きに 1 を足した数 */
const RPCBVERS_STAT = 3; /* rpcbind V2、V3、V4 だけのために提供 */
const RPCBVERS_4_STAT = 2;
const RPCBVERS_3_STAT = 1;
const RPCBVERS_2_STAT = 0;
/* getport と getaddr に関するすべての状態のリンクリスト */
struct rpcbs_addrlist {
rpcprog_t prog;
rpcvers_t vers;
int success;
int failure;
string netid<>;
struct rpcbs_addrlist *next;
};
/* rmtcall に関するすべての状態のリンクリスト*/
struct rpcbs_rmtcalllist {
rpcprog_t prog;
rpcvers_t vers;
rpcproc_t proc;
int success;
int failure;
int indirect; /* 直接的に呼び出すか、間接的に呼び出すか */
string netid<>;
struct rpcbs_rmtcalllist *next;
};
typedef int rpcbs_proc[RPCBSTAT_HIGHPROC];
typedef rpcbs_addrlist *rpcbs_addrlist_ptr;
typedef rpcbs_rmtcalllist *rpcbs_rmtcalllist_ptr;
struct rpcb_stat {
rpcbs_proc info;
int setinfo;
int unsetinfo;
rpcbs_addrlist_ptr addrinfo;
rpcbs_rmtcalllist_ptr rmtinfo;
};
/*
* 監視する rpcbind のバージョン 1 つに対して
* 1 つの rpcb_stat 構造体が返される。
*/
typedef rpcb_stat rpcb_stat_byvers[RPCBVERS_STAT];
/* rpcbind 手続き */
program RPCBPROG {
version RPCBVERS {
void
RPCBPROC_NULL(void) = 0;
/*
* [r_prog, r_vers, r_addr, r_owner,r_netid] の組み合わせを登録。
* セキュリティー上の理由から、rpcbind サーバーはこの手続きの要求を
* ループバックトランスポートのみで受け付ける。成功の場合は真を、
* 失敗の場合は偽を返す。
*/
bool
RPCBPROC_SET(rpcb) = 1;
/*
* [r_prog, r_vers, r_owner, r_netid] の組み合わせを登録解除。
* vers がゼロの場合、すべてのバージョンが登録解除される。
* セキュリティー上の理由から、rpcbind サーバーは
* この手続きの要求をループバックトランスポート
* のみで受け付ける。成功の場合は真を、失敗の場合は偽を返す。
*/
bool
RPCBPROC_UNSET(rpcb) = 2;
/*
* [r_prog, r_vers, r_netid] の組み合わせが登録されている
* 汎用アドレスを返す。r_addr を指定すると、
* r_addr へマージされた汎用アドレスを返す。
* r_owner は無視する。失敗の場合は偽を返す。
*/
string
RPCBPROC_GETADDR(rpcb) = 3;
/* すべての割り当てのリストを返す。 */
rpcblist
RPCBPROC_DUMP(void) = 4;
/*
* リモートマシン上の手続きを呼び出す。
* 登録されていない場合はこの手続きは
* 何も出力しない。つまり、エラー情報を返さない。
*/
rpcb_rmtcallres
RPCBPROC_CALLIT(rpcb_rmtcallargs) = 5;
/*
* rpcbind サーバーシステム上の時刻を返す。
*/
unsigned int
RPCBPROC_GETTIME(void) = 6;
struct netbuf
RPCBPROC_UADDR2TADDR(string) = 7;
string
RPCBPROC_TADDR2UADDR(struct netbuf) = 8;
} = 3;
version RPCBVERS4 {
bool
RPCBPROC_SET(rpcb) = 1;
bool
RPCBPROC_UNSET(rpcb) = 2;
string
RPCBPROC_GETADDR(rpcb) = 3;
rpcblist_ptr
RPCBPROC_DUMP(void) = 4;
/*
* 注: RPCBPROC_BCAST は CALLIT と同じ機能を持つ。
* 新しい名前の目的は RPCBPROC_BCAST はブロードキャスト RPC に
* 使用し、RPCBPROC_INDIRECT は間接呼び出しに使用する
* ことを示すため。
*/
rpcb_rmtcallres
RPCBPROC_BCAST(rpcb_rmtcallargs) = RPCBPROC_CALLIT;
unsigned int
RPCBPROC_GETTIME(void) = 6;
struct netbuf
RPCBPROC_UADDR2TADDR(string) = 7;
string
RPCBPROC_TADDR2UADDR(struct netbuf) = 8;
/*
* RPCBPROC_GETADDR と同じ機能を持つが、
* バージョン番号がわからなければ、
* アドレスが返されない点が異なる。
*/
string
RPCBPROC_GETVERSADDR(rpcb) = 9;
/*
* リモートマシン上の手続きを呼び出す。登録されていない場合は、
* この手続きは出力を行う。つまり、エラー情報を返す。
*/
rpcb_rmtcallres
RPCBPROC_INDIRECT(rpcb_rmtcallargs) = 10;
/*
* RPCBPROC_GETADDR と同じ機能を持つが、
* この組み合わせ (prog, vers) へ
* 登録されたアドレスのリストを返す点が異なる。
*/
rpcb_entry_list_ptr
RPCBPROC_GETADDRLIST(rpcb) = 11;
/*
* rpcbind サーバーの動作に関する統計情報を返す。
*/
rpcb_stat_byvers
RPCBPROC_GETSTAT(void) = 12;
} = 4;
} = 100000;