Previous Up

A.4  Sources pour RPC

A.4.1  Makefile pour le serveur et le client RPC

#
# Generation d'un client et d'un serveur RPC de demonstration
# (simple addition et soustraction d'entiers).
#

# Quelques constantes liees au projet

CLIENT_OBJS=calc_client.o calc_clnt.o calc_xdr.o
SERVER_OBJS=calc_server.o calc_svc.o calc_xdr.o

# Message pour la marche a suivre

all:
 @echo -e "\
Tapez d'abord make generate pour obtenir le fichier d'inclusion .h et\n\
les fichiers C. Modifiez les programmes calc_client.c et calc_server.c\n\
puis lancez la compilation par make compile."

# Generation des fichiers C par rpcgen

generate: calc.x
 rpcgen -a -C $^ 

# Copie des fichiers modifies a la main sur leurs modeles

copy:
 cp calc_client_modified.c calc_client.c
 cp calc_server_modified.c calc_server.c

# Compilation des programmes C

compile: client server

client: ${CLIENT_OBJS} calc.h
 gcc -o client ${CLIENT_OBJS}

server: ${SERVER_OBJS} calc.h
 gcc -o server ${SERVER_OBJS}

# Regle de nettoyage

clean: 
 rm -f client server *.o calc.h calc_svc.c calc_clnt.c calc_xdr.c
 rm -f calc_client.c calc_server.c

A.4.2  Définition des RPC

/********************************************************************/
/** Fichier de definition de RPC d'addition et de soustraction     **/
/********************************************************************/

/** Quelques constantes **/

#define PROGRAM_NUMBER 19992000
#define VERSION_NUMBER 1

/** Structures des parametres des procedures **/

struct operandes {
 int x;
 int y;
};

/** Definition des RPC **/

program CALC_PROG {
   version CALC_VERSION {
     int ADD(operandes) = 1;
     int SUB(operandes) = 2;
   } = VERSION_NUMBER;
} = PROGRAM_NUMBER;

A.4.3  Fichier C du serveur

/*
 * This is sample code generated by rpcgen.
 * These are only templates and you can use them
 * as a guideline for developing your own functions.
 */

#include "calc.h"

int * 
add_1_svc(operandes *argp, struct svc_req *rqstp)
{

 static int  result;

/* AJOUT DE CODE : implantation de l'addition */
 result=argp->x+argp->y;
/* FIN D'AJOUT DE CODE */

 return(&result);
}

int * 
sub_1_svc(operandes *argp, struct svc_req *rqstp)
{

 static int  result;

/* AJOUT DE CODE : implantation de la soustraction */
 result=argp->x-argp->y;
/* FIN D'AJOUT DE CODE */

 return(&result);
}

A.4.4  Fichier C du client

/*
 * This is sample code generated by rpcgen.
 * These are only templates and you can use them
 * as a guideline for developing your own functions.
 */

#include "calc.h"


void
/** MODIFICATION DE CODE : ajout des operandes en parametre **/
calc_prog_1( char* host, int x, int y )
/** FIN DE MODIFICATION DE CODE **/
{
 CLIENT *clnt;
 int  *result_1;
 operandes  add_1_arg;
 int  *result_2;
 operandes  sub_1_arg;
 clnt = clnt_create(host, CALC_PROG, CALC_VERSION, "udp");
 if (clnt == NULL) {
  clnt_pcreateerror(host);
  exit(1);
 }
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
 add_1_arg.x = x ; add_1_arg.y = y ; 
/** FIN D'AJOUT DE CODE **/
 result_1 = add_1(&add_1_arg, clnt);
 if (result_1 == NULL) {
  clnt_perror(clnt, "call failed:");
 }
/** AJOUT DE CODE : affichage du resultat de la RPC **/
 printf("%d + %d = %d\n",add_1_arg.x,add_1_arg.y,*result_1);
/** FIN D'AJOUT DE CODE **/
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
 sub_1_arg.x = x ; sub_1_arg.y = y ; 
/** FIN D'AJOUT DE CODE **/
 result_2 = sub_1(&sub_1_arg, clnt);
 if (result_2 == NULL) {
  clnt_perror(clnt, "call failed:");
 }
/** AJOUT DE CODE : affichage du resultat de la RPC **/
 printf("%d - %d = %d\n",sub_1_arg.x,sub_1_arg.y,*result_2);
/** FIN D'AJOUT DE CODE **/
 clnt_destroy( clnt );
}


main( int argc, char* argv[] )
{
 char *host;
/** AJOUT DE CODE : variables pour les operandes **/
 int x,y;
/** FIN D'AJOUT DE CODE **/

/** MODIFICATION DE CODE : nouvelle syntaxe **/
 if(argc < 4) {
  printf("usage: %s server_host op1 op2\n", argv[0]);
/** FIN DE MODIFICATION DE CODE **/
  exit(1);
 }
 host = argv[1];
/** MODIFICATION DE CODE : recuperation et utilisation des operandes **/
 x = atoi(argv[2]);
 y = atoi(argv[3]);
 calc_prog_1( host, x, y );
/** FIN DE MODIFICATION DE CODE **/
}

Previous Up