次のデータ構造は参考のために示しますが、変更される可能性があります。
最初に示すのは、クライアント側の RPC ハンドルで、<rpc/clnt.h> で定義されています。下位レベルの RPC を使用する場合は、例 4-16 に示したように接続ごとに 1 つのハンドルを作成して初期化する必要があります。
typedef struct {
AUTH *cl_auth; /* 認証情報 */
struct clnt_ops {
enum clnt_stat (*cl_call)(); /* 遠隔手続き呼び出し */
void (*cl_abort)(); /* 呼び出しの中止 */
void (*cl_geterr)(); /* 特定エラーコードの取得 */
bool_t (*cl_freeres)(); /* 戻り値の解放*/
void (*cl_destroy)(); /* この構造体の破棄 */
bool_t (*cl_control)(); /* RPC の ioctl() */
} *cl_ops;
caddrt_t cl_private; /* プライベートに使用 */
char *cl_netid; /* ネットワークトークン */
char *cl_tp; /* デバイス名 */
} CLIENT;
|
クライアント側ハンドルの第 1 フィールドは、 <rpc/auth.h> で定義された認証情報の構造体です。このフィールドはデフォルトで AUTH_NONE に設定されているため、例 4-17に示すように、必要に応じてクライアント側プログラムで cl_auth を初期化する必要があります。
typedef struct {
struct opaque_auth ah_cred;
struct opaque_auth ah_verf;
union des_block ah_key;
struct auth_ops {
void (*ah_nextverf)();
int (*ah_marshal)(); /* nextverf とシリアライズ */
int (*ah_validate)(); /* 妥当性検査の確認 */
int (*ah_refresh)(); /* 資格のリフレッシュ */
void (*ah_destroy)(); /* この構造体の破棄 */
} *ah_ops;
caddr_t ah_private;
} AUTH;
|
AUTH 構造体の ah_cred には呼び出し側の資格が、ah_verf には資格を確認するためのデータが入っています。詳細については、「認証」 を参照してください。
例 4-18 には、サーバー側のトランスポートハンドルを示します。
typedef struct {
int xp_fd;
#define xp_sock xp_fd
u_short xp_port; /* 結合されたポート番号、旧形式 */
struct xp_ops {
bool_t (*xp_recv)(); /* 要求の受信 */
enum xprt_stat (*xp_stat)(); /* トランスポートステータスの取得 */
bool_t (*xp_getargs)(); /* 引数の取り出し */
bool_t (*xp_reply)(); /* 応答の送信 */
bool_t (*xp_freeargs)(); /* 引数に割り当てたメモリーの解放* */
void (*xp_destroy)(); /* この構造体の破棄 */
} *xp_ops;
int xp_addrlen; /* 遠隔アドレスの長さ、旧形式 */
char *xp_tp; /* トランスポートプロバイダのデバイス名 */
char *xp_netid; /* ネットワークトークン */
struct netbuf xp_ltaddr; /* ローカルトランスポートアドレス */
struct netbuf xp_rtaddr; /* 遠隔トランスポートアドレス */
char xp_raddr[16]; /* 遠隔アドレス、旧形式 */
struct opaque_auth xp_verf; /* raw 応答の確認 */
caddr_t xp_p1; /* プライベート: svc ops で使用 */
caddr_t xp_p2; /* プライベート: svc ops で使用 */
caddr_t xp_p3; /* プライベート: svc lib で使用 */
} SVCXPRT;
|
表 4-5 は、サーバー側のトランスポートハンドルに対応するフィールドを示します。
表 4-5 RPC サーバー側のトランスポートハンドル|
ハンドルに結合したファイル記述子。複数のサーバーハンドルで 1 つのファイル記述子を共有できる |
|
|
トランスポートのネットワーク ID (たとえば、udp)。ハンドルはこのトランスポート上に作成される。xp_tp は、このトランスポートに結合したデバイス名 |
|
|
サーバー自身の結合アドレス |
|
|
RPC の呼び出し側アドレス (したがって、呼び出しのたびに変る) |
|
|
svc_tli_create() のようなエキスパートレベルのルーチンで初期化される |
その他のフィールドは、ボトムレベルのサーバールーチン svc_dg_create() と svc_vc_create() で初期化されます。
接続型端点では、表 4-6 の各フィールドには、接続要求がサーバーに受け入れられるまで正しい値が入りません。
表 4-6 RPC 接続型端点|
接続が確立するまでは無効なフィールド |
||
|---|---|---|
|
xp_fd |
xp_ops() |
xp_p1() |
|
xp_p2 |
xp_verf() |
xp_tp() |
|
xp_ltaddr |
xp_rtaddr() |
xp_netid() |