Sun Microsystems, Inc.
spacerspacer
spacer www.sun.com docs.sun.com |
spacer
black dot
 
 
D.  RPC Code Examples Directory Listing Program and Support Routines (rpcgen)  Previous   Contents   Next 
   
 

Time Server Program (rpcgen)


Example D-4 rpcgen Program: time.x

/*
 * time.x: Remote time protocol
 */
program TIMEPROG {
 	version TIMEVERS {
 			unsigned int TIMEGET(void) = 1;
 	} = 1;
} = 0x20000044;

#ifdef RPC_SVC
%int *
%timeget_1()
%{
%	static int thetime;
%
%	thetime = time(0);
%	return (&thetime);
%}
#endif

Add Two Numbers Program (rpcgen)


Example D-5 rpcgen program: Add Two Numbers

/* This program contains a procedure to add 2 numbers to
demonstrate
 * some of the features of the new rpcgen. Note that add() takes 2
 * arguments in this case.
 */
program ADDPROG {			/* program number */
	version ADDVER {		/* version number */
		int add ( int, int )  	/* procedure */
			= 1;
	} = 1;
} = 199;

Spray Packets Program (rpcgen)

Refer to the notes section on the spray(1M) man page for information about using this tool.


Example D-6 rpcgen program: spray.x

/*
 * Copyright (c) 1987, 1991 by Sun Microsystems, Inc.
 */

/* from spray.x */

#ifdef RPC_HDR
#pragma ident "@(#)spray.h  1.2  91/09/17 SMI"
#endif

/*
 * Spray a server with packets
 * Useful for testing flakiness of network interfaces
 */

const SPRAYMAX = 8845;	/* max amount can spray */

/*
 * GMT since 0:00, 1 January 1970
 */
struct spraytimeval {
	unsigned int sec;
	unsigned int usec;
};

/*
 * spray statistics
 */
struct spraycumul {
	unsigned int counter;
	spraytimeval clock;
};

/*
 * spray data
 */
typedef opaque sprayarr<SPRAYMAX>;

program SPRAYPROG {
	version SPRAYVERS {
		/*
		 * Just throw away the data and increment the counter. This
		 * call never returns, so the client should always time it
out.
		 */
		void
		SPRAYPROC_SPRAY(sprayarr) = 1;

		/*
		 * Get the value of the counter and elapsed time since last
		 * CLEAR.
		 */
		spraycumul	
		SPRAYPROC_GET(void) = 2;

		/*
		 * Clear the counter and reset the elapsed time
		 */
		void
		SPRAYPROC_CLEAR(void) = 3;
	} = 1;
} = 100012;

Print Message Program With Remote Version


Example D-7 printmesg.c

/* printmsg.c: print a message on the console */
#include <stdio.h>

main(argc, argv)
 	int argc;
 	char *argv[];
{
	char *message;

	if (argc != 2) {
		fprintf(stderr, "usage: %s <message>\n", argv[0]);
		exit(1);
	}
	message = argv[1];
	if( !printmessage(message) ) {
		fprintf(stderr, "%s: couldn't print your message\n",
		        argv[0]);
		exit(1);
	}
	printf("Message Delivered!\n");
	exit(0);
}

/* Print a message to the console. */

/*
 * Return a boolean indicating whether the message was actually
 * printed.
 */
printmessage(msg)
	char *msg;
{
	FILE *f;

	if = fopen("/dev/console","w");
		if (f == (FILE *)NULL)
			return (0);
	fprintf(f,"%sen", msg);
	fclose(f);
	return (1);
}


Example D-8 Remote Version of printmesg.c

/*  * rprintmsg.c: remote version of "printmsg.c"  */ 
#include <stdio.h> 
#include <rpc/rpc.h> /* always needed */ 
#include "msg.h"     /* msg.h generated by rpcgen */ 

main(argc, argv) 
	int argc;
	char *argv[];
{
	CLIENT *cl; 
	int *result;  	
	char *server;
	char *message;
	extern int sys_nerr;
	extern char *sys_errlist[]; 

	if (argc != 3) { 
		fprintf(stderr,"usage: %s host messagen", argv[0]);
		exit(1);
	}
	/* 
	 * Save values of command line arguments
	 */
	server = argv[1];
	message = argv[2]; 
/*
 * Create client"handle" used for calling
 * MESSAGEPROG on the server
 * designated on the command line.
 */ 
	cl = clnt_create(server, MESSAGEPROG, PRINTMESSAGEVERS,
	                 "visible");
	if (cl == (CLIENT *)NULL) {
		/* 
		 * Couldn't establish connection with server.
		 * Print error message and die.
		 */
		clnt_pcreateerror(server);
		exit(1);
	}
	/* Call the remote procedure "printmessage" on the server */
	result = printmessage_1(&message, cl);
	if (result == (int *)NULL) {  	
	/*
	 * An error occurred while calling the server.
	 * Print error message and die.
	 */ 
		clnt_perror(cl, server);
		exit(1);
	}
	/* Okay, we successfully called the remote procedure. */
	if (*result == 0) { 
		/*
		 * Server was unable to print our message.
		 * Print error message and die.
		 */
		fprintf(stderr,"%s"
	}
/* The message got printed on the server's console */
	printf("Message delivered to %s!\n", server);
	exit(0);
}


Example D-9 rpcgen Program: msg.x

/* msg.x: Remote message printing protocol */
program MESSAGEPROG {
 	version MESSAGEVERS {
 		int PRINTMESSAGE(string) = 1;
 	} = 1;
} = 0x20000001;


Example D-10 mesg_proc.c

/*
 * msg_proc.c: implementation of the remote
 * procedure "printmessage"
 */

#include <stdio.h>
#include <rpc/rpc.h> 	/* always needed */
#include "msg.h" 	/* msg.h generated by rpcgen */

/*
 * Remote version of "printmessage"
 */
/*ARGSUSED1*/
int printmessage_1(msg, req)
	char **msg;
	struct svc_req *req;
{
	static int result; /* must be static! */
	FILE *f;

	f = fopen("/dev/console", "w");
	if (f == (FILE *)NULL) {
		result = 0;
		return (&result);
	}
	fprintf(f, "%sen", *msg);
 	fclose(f);
 	result = 1;
 	return (&result);
}

 
 
 
  Previous   Contents   Next