単純インタフェースを使用するサーバープログラムは、理解しやすいものです。サーバーは、呼び出される手続きを登録するために rpc_reg() を呼び出します。次に、RPC ライブラリのリモートプロシージャディスパッチャである svc_run() を呼び出し、要求が来るのを待機します。
rpc_reg() には次の引数があります。
rpc_reg ( rpcprog_t prognum /* サーバープログラム番号 */ rpcvers_t versnum /* サーバーバージョン番号 */ rpcproc_t procnum /* サーバー手続き番号 */ char *procname /* リモート関数の名前 */ xdrproc_t inproc /* 引数を符号化するフィルタ */ xdrproc_t outproc /* 結果を復号化するフィルタ */ char *nettype /* トランスポートの選択 */ ); |
svc_run() は RPC 呼び出しメッセージに応えてサービス手続きを起動します。rpc_reg() のディスパッチャはリモートプロシージャが登録されたときに指定された XDR フィルタを使用して、リモートプロシージャの引数の復号化と、結果の符号化を行います。サーバープログラムについての注意点をいくつか挙げます。
ほとんどの RPC アプリケーションが、関数名の後に _1 を付ける命名規則に従っています。手続き名に _n 番号を付けることにより、サービスのバージョン番号 n を表します。
引数と結果はアドレスで渡されます。リモートで呼び出される関数はすべてこうなります。関数の結果として NULL を渡すと、クライアントには応答が送信されません。 NULL は、送信する応答がないことを示します。
結果は固定のデータ領域に存在します。これは、その値が実際の手続きが終了したあとにアクセスされるからです。RPC 応答メッセージを作成する RPC ライブラリ関数は結果にアクセスして、その値をクライアントに戻します。
引数は 1 つだけ使用できます。データに複数の要素がある場合、構造体の中に入れると、1 つの引数として渡すことができます。
手続きは、指定するタイプのトランスポートごとに登録されます。タイプのパラメータが (char *)NULL
の場合、手続きは NETPATH により指定されるすべてのトランスポートに登録されます。