|
|
There are two pseudo-RPC interface routines provided to support program testing. These routines, clnt_raw_create and svc_raw_create, do not involve the use of any real transport. They exist to help the developer debug and test the non-communications-oriented aspects of an application before running it over a real network.
This is an example of their use:
/*
* A simple program to increment a number by 1
*/
#include <stdio.h>
#include <rpc/rpc.h>
#include <rpc/raw.h>
struct timeval TIMEOUT = {0, 0};
static void server();
main (argc, argv)
int argc;
char **argv;
{
CLIENT *cl;
SVCXPRT *svc;
int num = 0, ans;
if (argc == 2)
num = atoi(argv[1]);
svc = svc_raw_create();
if (svc == NULL) {
fprintf(stderr, "Could not create server handle\n");
exit(1);
}
svc_reg(svc, 200000, 1, server, 0);
cl = clnt_raw_create(200000, 1);
if (cl == NULL) {
clnt_pcreateerror("raw");
exit(1);
}
if (clnt_call(cl, 1, xdr_int, &num, xdr_int, &ans,
TIMEOUT) != RPC_SUCCESS) {
clnt_perror(cl, "raw");
exit(1);
}
printf("Client: number returned %d\n", ans);
exit(0) ;
}
static void
server(rqstp, transp)
struct svc_req *rqstp;
SVCXPRT *transp;
{
int num;
switch(rqstp->rq_proc) {
case 0:
if (svc_sendreply(transp, xdr_void, 0) == NULL) {
fprintf(stderr, "error in null proc\n");
exit (1);
}
return;
case 1:
break;
default:
svcerr_noproc(transp);
return;
}
if (!svc_getargs(transp, xdr_int, &num)) {
svcerr_decode(transp);
return;
}
num++;
if (svc_sendreply(transp, xdr_int, &num) == NULL) {
fprintf(stderr, "error in sending answer\n");
exit (1);
}
return;
}
Note the following points: