ONC+ 開発ガイド

バッチコードの例


例 D-11 バッチを使用するクライアントプログラムの例

#include <stdio.h>
#include <rpc/rpc.h>
#include "windows.h"

main(argc, argv)
 int             argc;
	char          **argv;
{
 struct timeval  total_timeout;
	register CLIENT *client;
 enum clnt_stat  clnt_stat;
	char            buf[1000], *s = buf;

	if ((client = clnt_create(argv[1], WINDOWPROG, WINDOWVERS,
	              "CIRCUIT_V")) == (CLIENT *) NULL) {
		clnt_pcreateerror("clnt_create");
		exit(1);
 }

	timerclear(&total_timeout);
 while (scanf("%s", s) != EOF) {
		clnt_call(client, RENDERSTRING_BATCHED, xdr_wrapstring,
		  &s,xdr_void, (caddr_t) NULL, total_timeout);
 }

	/* ここでパイプラインをフラッシュ */
	total_timeout.tv_sec = 20;
	clnt_stat = clnt_call(client, NULLPROC, xdr_void,
 		 (caddr_t) NULL, xdr_void, (caddr_t) NULL,
total_timeout);
 if (clnt_stat != RPC_SUCCESS) {
		clnt_perror(client, "rpc");
 	exit(1);
	}
	clnt_destroy(client);
 exit(0);
}


例 D-12 バッチを使用するサーバープログラムの例

#include <stdio.h>
#include <rpc/rpc.h>
#include "windows.h"

void            windowdispatch();
main()
{
 int num;

	num = svc_create(windowdispatch, WINDOWPROG, WINDOWVERS,
	      "CIRCUIT_V");
	if (num == 0) {
		fprintf(stderr, "can't create an RPC server¥n");
 	exit(1);
	}
	svc_run();                       /* 戻らない */
	fprintf(stderr, "should never reach this point¥n");
}

void
windowdispatch(rqstp, transp)
	struct svc_req *rqstp;
	SVCXPRT        *transp;
{
	char           *s = NULL;

	switch (rqstp->rq_proc) {
		case NULLPROC:
			if (!svc_sendreply(transp, xdr_void, 0))
				fprintf(stderr, "can't reply to RPC call¥n");
 		return;
		case RENDERSTRING:
			if (!svc_getargs(transp, xdr_wrapstring, &s)) {
				fprintf(stderr, "can't decode arguments¥n");
				/* 呼び出し側にエラーを通知 */
				svcerr_decode(transp);
 			break;
			}
			/* 文字列 s を処理するコード */
 		if (!svc_sendreply(transp, xdr_void, (caddr_t) NULL))
		 	fprintf(stderr, "can't reply to RPC call¥n");
			break;
 	case RENDERSTRING_BATCHED:
 		if (!svc_getargs(transp, xdr_wrapstring, &s)) {
				fprintf(stderr, "can't decode arguments¥n");
 			/* プロトコルエラーのため何も返さない */
 			break;
			}
 		/* 文字列 s を処理するコード。ただし応答はしない。 */
			break;
 	default:
			svcerr_noproc(transp);
 		return;
 }
	/* 引数の復号化で割り当てた文字列を解放 */
 svc_freeargs(transp, xdr_wrapstring, &s);
}