Listing 5 RPC transaction example

/*RPC client for machine */
#include <stdio.h>
#include "netfn.h"

struct messout {
      char call[82]  ;
      int flag ; } messout ;

struct messin {
      char reply[82] ; } messin ;


main()
{

  int dgstat;
  char *get_neterrmess() ;

  messout.flag = 0;
  open_net_client("master") ;                          // Open the client
  strcpy(messout.call,"Sending datagram to rpc server") ;
  printf("Sending message to rpc server\n") ;
  dgstat = NetTransact("rpcserver", messin, messout) ; // Transact with rpcserver
  if (dgstat)
   printf("%s\n", get_neterrmess(dgstat)) ;
  else
   { printf("Received reply: %s\n", &messin.reply) ;
     messout.flag = -1 ;
     NetTransact("rpcserver", messin, messout) ;    // Terminate server
   }
  close_net_client() ;
}

/* **************************************************** */
/* RPC server for machine 2 */

#include <stdio.h>
#include <string.h>
#include "netfn.h"


/* Message structures must be static */
struct messin {
      char call[82] ;
      int flag ; } ;

struct messout {
      char reply[82] ;} messout ;

int flag = 40 ;
char *name= "rpcserver" ;

/* Remote Procedure */
struct messout *server(struct messin *messptr)
{ if (messptr->flag != -1)
    { printf("Message in : %s\n", messptr->call) ;
     strcpy(messout.reply, "Sending reply from rpc server") ;
     printf("Returning reply\n") ;
    }
  else
   { printf("Terminate message issued\n") ;
     flag = messptr->flag ;
   }
  return(&messout) ;
}

main()
{
/* Install destructor */
   atexit(remove_all_rpcservers) ;

   if (install_rpcserver(name, (void *)server, sizeof(messout)) == NULL)
     { printf("Cannot add network name %s\n", name) ;
       exit(1) ;
     }

   printf("Starting\n") ;

   while(flag != -1)
     net_comms() ;                      // Loop round servicing datagrams until terminated

   printf("Finish\n") ;
}
/* End of File */