Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
TD 7 - Remote Procedure Call (RPC)
Claude Duvallet
Universit du Havre UFR Sciences et Techniques 25 rue Philippe Lebon - BP 540 76058 LE HAVRE CEDEX
[Link]@[Link]
Anne scolaire 2008-2009
Claude Duvallet 1/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Plan de la prsentation
1 2 3 4 5 6 7
Objectifs Principe gnral de fonctionnement Un cas particulier : Les RPC sous Linux Un outils : rpcgen Un exemple Concepts avancs Les RPC en Java
Claude Duvallet 2/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Objectifs
Souvent, la communication par socket = invocation de commande distance. Problmes :
Lourd programmer : Encodage des donnes (paramtres, rsultats, ...), identication du serveur, du protocole, etc. Pas naturel. laboration dun norme switch au niveau du serveur.
Retrouver la smantique habituelle de lappel de procdure :
sans se proccuper de la localisation de la procdure, sans se proccuper du traitement des dfaillances.
Les difcults :
Appel de procdures locales :
Appelant et appel dans le mme espace virtuel : mme mode de pannes, appel et retour able.
Claude Duvallet 3/25
Appel de procdures distantes :
Appelant et appel dans deux espaces virtuels : mode de pannes indpendant, rseau non able, temps de rponse.
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Principe gnral de fonctionnement
Claude Duvallet 4/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Les RPC sous Linux
Protocole dni par SUN :
Il est la base de limplmentation de NFS. Il est Open Source. Il utilise le protocole XDR pour les change de donnes (transport des arguments et du rsultat).
Fonctionnement :
Au niveau serveur :
un processus dmon attend des connexions (portmap). il dtermine le programme p qui contient la procdure (qui sest au pralable fait rfrencer). le programme p dcode les paramtres, excute la procdure et encode le rsultat. le dmon retourne le rsultat.
Au niveau client, le talon du client va :
dterminer le numro du programme (public : 0x20000000 0x3fffffff). dterminer la version du programme utiliser. dterminer Duvallet 5/25de laTD 7 - Remote Procedure Call (RPC) procdure appliquer. Claude le numro
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Dveloppements
Il existe trois faon de dvelopper des programmes utilisant des RPC :
Utiliser les fonctions de la couche intermdiaire. Utiliser les fonctions de la couche base. Utiliser le compilateur rpcgen.
Claude Duvallet 6/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
La couche intermdiaire
Elle comporte peu de fonctions :
int registerrpc(unsigned long prg, unsigned long ver, unsigned long proc, void *(*f)(), xdrproc_t xdr_param, xdrproc_t xdr_result) void pmap_unset (unsigned int prog, unsigned int ver) void svc_run() int callrpc(char *host, unsigned long prog, unsigned long vers, unsigned long proc, xdrproc_t xdr_param, void* param, xdrproc_t xdr_result, void* result)
Mais :
le programmeur est limit dans la conguration du systme (udp, pas dauthentication possible). le programmeur doit dvelopper lencodage et le dcodage.
Claude Duvallet 7/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
La couche basse
Cest un ensemble complet de fonctions Mais son utilisation est beaucoup plus complexe que la couche intermdiaire :
Elle possde plus de 20 fonctions
nutiliser que :
lorsque le protocole de communication et les dlais de temporisation de la couche intermdiaire ne sont pas satisfaisant. lorsquon veut dvelopper des RPC asynchrones. lorsquon veut authentier le client.
Claude Duvallet 8/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Le compilateur RPCGEN...
Claude Duvallet 9/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Le compilateur rpcgen et le langage de description RPCL
Utilisation de rpcgen :
rpcgen service_rpc.x .h _xdr.c _svc.c _clnt.c rpcgen -a service_rpc.x _client.c _server.c Makele rpcgen -c service_rpc.x _xdr.c rpcgen -h service_rpc.x .h rpcgen -l service_rpc.x _clnt.c rpcgen -s transport service_rpc.x _svc. (tcp ou udp) rpcgen -m transport service_rpc.x _clnt.c sans main() (tcp ou udp).
Les chiers .x ont la structure suivante :
[Definition des constantes] [Definition des types] programme NOM_PROGRAMME { [version NOM_VERSION { [type_resultat nom_procedure (type_du_parametre) = numero_procedure:] } = numero_version] } = numero_programme;
Claude Duvallet 10/25 TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Le langage de description RPCL
Les constantes : const identificateur = valeur Les types :
struct nom_du_type {
type attribut ; }
ou typedef type nom_du_type ; Cas particulier des tableaux et chanes de caractres : typedef int vecteur <1000> typedef string chaine <255>
Claude Duvallet 11/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Lexemple Helloworld en C sous Linux
Le chier de description helloworld.x
typedef string chaine<255>; program HELLO_WORLD_PROG { version HELLO_WORLD_VERSION_1 { void hello_world_null(void)=0; chaine hello_world(chaine)=1; }=1; } = 0x22222220; rpcgen helloworld.x helloworld.h helloworld_xdr.c helloworld_svc.c helloworld_clnt.c rpcgen -a helloworld.x Makele helloworld_server.c Claude Duvallet helloworld_client.c 12/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
helloworld_server.c
/* * 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 "helloworld.h" void * hello_world_null_1_svc(void *argp, struct svc_req *rqstp) { static char * result; printf ("Ping\n");fflush (stdout); return (void *) &result; } chaine * hello_world_1_svc(chaine *argp, struct svc_req *rqstp) { static chaine result; static char tab[255]; /* * insert server code here */ result=tab; strcpy (result, "Hello "); strcat (result, *argp); printf ("Result: %s\n", *argp); printf ("Result: %s\n", result); return &result; }
Claude Duvallet 13/25 TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
helloworld_client.c
/* * 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 "helloworld.h" void hello_world_prog_1(char *host) { CLIENT *clnt; void *result_1; char *hello_world_null_1_arg; chaine *result_2; chaine hello_world_1_arg; #ifndef DEBUG clnt = clnt_create (host, HELLO_WORLD_PROG, HELLO_WORLD_VERSION_1, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } #endif /* DEBUG */ result_1 = hello_world_null_1((void*)&hello_world_null_1_arg, clnt); if (result_1 == (void *) NULL) { clnt_perror (clnt, "call failed"); } result_2 = hello_world_1(&host, clnt); if (result_2 == (chaine *) NULL) { clnt_perror (clnt, "call failed"); } printf ("%s\n",*result_2); #ifndef DEBUG clnt_destroy (clnt); #endif /* DEBUG */ } int main (int argc, char *argv[]) { if (argc < 2) { printf ("usage: %s server_host\n", argv[0]); exit (1); } Claude Duvallet 14/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Le programme HelloWorld
Ne pas oublier de d-enregistrer le processus serveur.
#include "helloworld.h" main (){ pmap_unset (HELLO_WORLD_PROG, HELLO_WORLD_VERSION_1); }
Vous pouvez tlcharger lensemble des sources du programme ladresse http ://[Link]/duvallet/Cours/CNAM/[Link] puis compilez et testez le programme ! Pour obtenir la liste des services RPC enregistrs sur une machine : rpcinfo -p [machine]
liste des services enregistrs
rpcinfo -u machine num_prg [num_version]
appel de la procdure 0 dun programme en utilisant le protocole udp
rpcinfo -t machine num_prg [num_version]
Claude Duvallet 0 dun programme en utilisant le protocole TD 7 - Remote Procedure Call (RPC) appel de la procdure 15/25
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Les RPC en JAVA
Par dfaut Java ne propose pas de classes permettant de faire des clients ou des serveurs RPC compatible avec loutil dvelopp par Sun. Un ensemble de classes Open Source a t dvelopp par ACPLT (Aachen Process Control Engineering) :
RemoteTea v1.0.4 (au 11 novembre 2004)
http ://[Link]/ks/[Link]
Ce projet propose aussi :
Un compilateur RPCL Java (jrpcgen). Un "portmapper" crit en Java (jportmap).
Claude Duvallet 16/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Les packages de Remote Tea
Claude Duvallet 17/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Le package [Link]
Claude Duvallet 18/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Le package [Link]
Claude Duvallet 19/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Fonctionnement gnral
Le stub serveur (Sous-classe de OncRpcServerStub) :
Senregistre au prs du portmap (instanciation de lattribut info). Spcie les ux XDR utilisables (instanciation de lattribut transport) en prcisant une mthode de dispatch (dsigne par une instance dune classe qui implmente OncRpcDispatchable).
Le stub client (Sous-classe de OncRpcClientStub) :
Se connecte au serveur (en invoquant lun des deux constructeurs de OncRpcClientStub). Lattribut client est alors instanci (objet de la classe OncRpcClient). Invoque une procdure via la mthode call de client.
Claude Duvallet 20/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Loutil jrpcgen (1/2)
Cest le compilateur qui permet de crer automatiquement les stubs (client et serveur) partir dun chier en langage RPCL Utilisation :
java -jar jrpcgen [options] fichier.x
Produit les chiers suivants :
[Link] : interface prcisant les constantes [Link] : classe proposant lappel des procdures distantes [Link] : classe abstraite spcialiser pour implmenter les procdures distantes [Link] : une classe par type dclar dans chier.x
Claude Duvallet 21/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Loutil jrpcgen (2/2)
les options :
-c <NomClasse> -d <Repertoire> -p <NomPackage> -s <NomClasse> -nobackup -noclient -noserver -parseonly
spcie le nom du stub client spcie le rpertoire destination spcie le nom du package spcie le nom du stub serveur ne cre pas de sauvegarde des chiers prcdemment gnrs ne cre pas le stub client ne cre pas le stub serveur vrie juste la syntaxe du .x
Claude Duvallet 22/25
TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Un exemple : HelloWorld en JAVA (1/3)
Le chier de description HelloWorld.x :
typedef string Chaine<255>; program HELLO_WORLD_PROG { version HELLO_WORLD_VERSION_1 { void hello_world_null(void)=0; Chaine hello_world(Chaine)=1; }=1; } = 0x22222220;
Gnration des souches :
java -jar [Link] HelloWorld.x
Compilation des programmes :
javac -classpath ./[Link] :./[Link] :./[Link] :. *.java
Vous pouvez tlcharger lensemble des sources du programme ladresse
http ://[Link]/duvallet/Cours/CNAM/[Link]
Claude Duvallet 23/25 TD 7 - Remote Procedure Call (RPC)
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Un exemple : HelloWorld en JAVA (2/3)
Le programme [Link] :
import import import import [Link].*; [Link].*; [Link]; [Link];
public class HelloServer extends HelloWorldServerStub{ public HelloServer () throws OncRpcException, IOException { super (); } public void hello_world_null_1(){ [Link] ("Connexion dun client"); } public Chaine hello_world_1(Chaine arg1){ [Link] ("Connexion dun client"); [Link] ("Reception de la chaine : "+[Link]); return new Chaine ("Hello "+[Link]+" !"); } public static void main (String args []){ try{ new HelloServer().run (); } catch (Exception e){ [Link] ("Erreur:"+e); Claude Duvallet 24/25 TD 7 - Remote Procedure Call (RPC) }
Objectifs Principe gnral de fonctionnement Les RPC sous Linux Loutil RPCGEN Lexemple Helloworld en C Les RPC en JAVA
Un exemple : HelloWorld en JAVA (3/3)
Le programme [Link] :
import [Link].*; import [Link]; import [Link]; public class HelloClient { public static void main (String args []){ try{ HelloWorldClient h = new HelloWorldClient ([Link](), OncRpcProtocols.ONCRPC_UDP); Chaine result = h.hello_world_1 (new Chaine ("Claude")); [Link] ("Resultat:"+[Link]); } catch (Exception e){ [Link] ("Erreur:"+e); } } }
Claude Duvallet 25/25
TD 7 - Remote Procedure Call (RPC)