1) Réalisation d'un appel distant en RPC

Remarque : Une procédure RPC ne peut avoir qu'un seul paramètre ! Utiliser un
pointeur sur ... result: pointe sur le résultat de la fonction distante. ... Exercice :
Ecrire le code d'un serveur qui contient une procédure qui incrémente un entier.

Part of the document



TD RPC




Réalisation d'un appel distant en RPC



Rappels de cours


Serveur -- enregistrement d'une fonction

int registerrpc (u_long no_pg, u_long no_vers, u_long no_proc,
void * (* fonction) ( ), xdrproc_t xdr_param, xdrproc_t xdr_result);

Paramètres :
no_pg: numéro du programme où enregistrer la fonction
no_vers: numéro de version
no_proc: numéro de procédure à donner à la fonction
fonction: pointeur sur la fonction à enregistrer
xdr_param: fonction d'encodage/décodage des paramètres
xdr_result: fonction d'encodage/décodage du résultat
Retour :
0: en cas de succès
-1: en cas d'erreur et envoi d'un message d'erreur sur stderr

On enregistre chaque fonction individuellement.

Remarque : Une procédure RPC ne peut avoir qu'un seul paramètre ! Utiliser
un pointeur sur une structure si nécessaire.
Remarque : Lors du premier enregistrement de fonction, le numéro de
programme est réservé et la fonction 0 est créée automatiquement (par
convention, la procédure 0 ne prendra pas de paramètres et ne renvoie rien,
elle sert juste à tester si un numéro de programme particulier existe).




Serveur -- attente d'appel de fonction

void svc_run();
Ne revient jamais sauf erreur grave.



Client -- appel distant
int callrpc (char * machine, u_long no_prog, u_long no_vers, u_long
no_proc, xdrproc_t xdr_param, void *param, xdrproc_t xdr_result, void
*result);

Paramètres :
Avant l'appel
machine: nom de la machine où se trouve la fonction à exécuter
no_prog, no_vers, no_proc: identifie la fonction à appeler
xdr_param: filtre XDR pour les paramètres
param: pointeur sur le paramètre à passer à la procédure
xdr_result: filtre XDR pour le résultat
result: pointeur sur zone réservée pour stocker le résultat de la RPC

Après l'appel
result: pointe sur le résultat de la fonction distante.




Retour :

1. 0: en cas de succès
2. autre en cas d'erreur (transtypé en clnt_stat et passé à la fonction
clnt_perrno, il y a affichage de l'erreur sur stderr)

Remarques: un appel à callrpc peut donc entrainer au plus 5 appels à la RPC
concernée et donc 5 exécutions. callrpc appelle la RPC correspondante
toutes les 5 secondes et s'il n'y a toujours pas de réponse il y a timeout
au bout de 25 secondes.

Exercice :


1. Ecrire le code d'un serveur qui contient une procédure qui incrémente
un entier.


2. Ecrire le code d'un client qui appelle cette procédure distante. Après
l'appel à la procédure, afficher la valeur retournée ainsi que la
valeur de la variable passée en argument. Que vaudrait cette variable
si sa valeur était modifiée dans la procédure distante ?




Fonctions d'encodage/décodage personnalisées


Rappels :

L'opération de sérialisation (ou de désérialisation) consiste à ajouter (ou
extraire) des informations dans un flot XDR réalisant ainsi le codage (ou
le décodage).
Le type xdrproc_t désigne de manière générique le pointeur sur les
fonctions XDR pour décoder ou encoder les données.
typedef bool_t (*xdrproc_t) (XDR*, void*)

Exemples de fonctions standard :
bool_t xdr_char(XDR *, char *)
bool_t xdr_int(XDR *, int *)
bool_t xdr_float(XDR *, float *)

Ces fonctions renvoient 0 lorsqu'elles fonctionnent (encodage ou décodage
réussi). Lorsque vous aurez à transmettre des données entre client et
serveur qui sont une composition de types élémentaires, vous écrirez votre
propre fonction d'encodage/décodage. Celle-ci aura généralement pour type :
bool_t mafonction (XDR *, (mastructure *) pointeur)


Exercice :

1. Ecrire une fonction d'encodage/décodage d'une structure contenant deux
entiers.


2. Ecrire une application client- serveur permettant de calculer le
quotient et le reste de la division de deux nombres entiers en un seul
appel distant.