例 4-10 は、「トップレベルのインタフェース」の時刻サービスのクライアント側プログラムを、中間レベルの RPC で書いたものです。この例のプログラムを実行するときは、どのトランスポートで呼び出しを行うか、コマンド行で指定する必要があります。
#include <stdio.h>
#include <rpc/rpc.h>
#include <netconfig.h> /* 構造体 netconfig を使用するため */
#include "time_prot.h"
#define TOTAL (30)
main(argc,argv)
int argc;
char *argv[];
{
CLIENT *client;
struct netconfig *nconf;
char *netid;
/* 以前のサンプルプログラムの宣言と同じ */
if (argc != 3) {
fprintf(stderr, "usage: %s host netid¥n",
argv[0]);
exit(1);
}
netid = argv[2];
if ((nconf = getnetconfigent( netid)) ==
(struct netconfig *) NULL) {
fprintf(stderr, "Bad netid type: %s¥n",
netid);
exit(1);
}
client = clnt_tp_create(argv[1], TIME_PROG,
TIME_VERS, nconf);
if (client == (CLIENT *) NULL) {
clnt_pcreateerror("Could not create client");
exit(1);
}
freenetconfigent(nconf);
/* これ以降は以前のサンプルプログラムと同じ */
}
この例では、getnetconfigent(netid) を呼び出して netconfig 構造体を取り出しています (詳細については、getnetconfig(3N) マニュアルページと『Transport Interfaces Programming Guide』を参照してください)。このレベルの RPC を使用する場合は、プログラムで直接ネットワーク (トランスポート) を選択できます
上記の例でプログラマがクライアントハンドル作成に許される時間を 30 秒に設定したいとすると、次のコード例の一部のように、 clnt_tp_create() への呼び出しは clnt_tp_create_timed() への呼び出しに替わります。
struct timeval timeout; timeout.tv_sec = 30; /* 30 秒 */ timeout.tv_usec = 0; client = clnt_tp_create_timed(argv[1], TIME_PROG, TIME_VERS, nconf, &timeout);