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 **/
}