RPC
RPC
RPC
Sistemas Distribuidos
Remote Procedure
Call
Contenidos
Remote Procedure Call (RPC)
Conceptos bsicos
Aspectos relacionados con las RPCs
RPC de Sun Microsystems
Biblioteca de funciones de RPC
Compilar un programa
Ejemplo de RPC
Aplicaciones/servicios
Sockets
Aplanamiento (marshalling), representacin externa de
datos
Protocolo de transporte
UDP y TCP
sumar(int a, int b)
int r;
r = a + b;
return r;
} Dir retorno
a
Registro de activacin
b
r
Funciones en el cliente:
Suplantar al procedimiento a ejecutar
Localizar al servidor
Empaquetar los parmetros y construir los mensajes
Enviar el mensaje al servidor
Esperar la recepcin del mensaje y devolver los
resultados
Funciones en el servidor:
Realizan tareas similares
Cliente Servidor
Id. De peticin
Id. De operacin
argumentos
Resultado
Preparar la respuesta
Desempaquetar y enviar
la respuesta
Proceso servidor
(llamado)
Registrar las RPCs Mquina servidora
Implementar los
procedimientos Proceso servidor
(llamado)
Stub o resguardo del servidor:
Recibir la peticin del cliente
Desempaquetar los parmetros Stub
Invocar el procedimiento de
manera local
Obtener la respuesta y
enviarla al cliente
Servidor
Stub
<opciones de comunicacin:
versin interfaz, tcp/udp,
>
<interfaz remota:
suma (in int a, in int b, out int c) ;
generador
>
STUB
03 5 lengthofstring
47 "Smit" Smith
811 "h___"
1215 6 lengthofstring
1619 "Lond" London
2023 "on__"
2427 1934 unsignedlong
XML
<person>
<name>Smith</name>
<place>London</place>
<year>1934</year>
</person >
1
cliente 6 servidor
4 2
7
1 Obtiene direccin 3
2 Registra direccin
3 Busca servidor
binder
4 Devuelve direccin
5 Peticin
6 Respuesta
7 Borra direccin (fin del servicio)
Modelos hbridos
Servidor RPC:
Para hacer frente a peticiones duplicadas
Filtrar las peticiones (nmeros de secuencia, etc.)
Si se necesita reenviar una respuesta de una peticin
no idempotente:
Guardar un histrico de las peticiones anteriormente
ejecutadas y su respuesta para no ejecutar de nuevo la
peticin.
COMPILADOR C COMPILADOR C
MONTADOR MONTADOR
EJECUTABLE EJECUTABLE
DESARROLLO DEL DESARROLLO
DEL
DEL CLIENTE SERVIDOR
CLIENTE SERVIDOR
6. Presentacin XDR
XDR
5. Sesin RPC
RPC
4. Transporte
TCP
TCP UDP
UDP
3. Red IP
IP
Detalles de implementacin:
NUM-PROG se definen en la RFC 1831
http://www.ietf.org/rfc/rfc1831.txt
La primera implementacin (versin) de un protocolo deber ser la 1
Los nmeros de procedimientos se especifican por el programador
./servidor &
rpcinfo p maquina.esi.inf.uclm.es
programa vers proto puerto
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 32772 status
100024 1 tcp 59338 status
99 1 udp 46936
99 1 tcp 40427
Argumentos:
host nombre del host remoto donde se localiza el programa
remoto
prognum Nmero de programa del programa remoto
versnumNmero de versin del programa remoto
nettype Protocolo de transporte:
NETPATH, VISIBLE, CIRCUIT_V, DATAGRAM_V, CIRCUIT_N,
DATAGRAM_N, TCP, UDP
Argumentos:
clnt Manejador de RPC del cliente
Argumentos:
clnt Manejador de RPC del cliente
s Mensaje de error
Algunas opciones:
-N Permite a los procedimientos tener mltiples argumentos
-a Genera todos los ficheros incluyendo cdigo de ejemplo para
cliente y servidor
-M Genera stubs multi-thread para paso de argumentos
Mquina A Mquina B
sumar(5,2)
cliente servidor
5+2
RED
suma_xdr.c
rpcgen Archivos
suma.x
comunes
suma.h
suma_svc.c
Ficheros generados por el programador
Archivos para
Ficheros generados mediante rpcgen suma.x
el servidor
servidor.c
suma_xdr.c
rpcgen Archivos
suma.x
comunes
suma.h
suma_svc.c
Ficheros generados por el programador
Archivos para
Ficheros generados mediante rpcgen suma.x
el servidor
servidor.c
program SUMAR {
version SUMAVER {
int SUMA(argumentos) = 1;
int RESTA(argumentos) = 2;
} = 1;
} = 99;
#include <rpc/rpc.h>
struct argumentos {
int a;
int b;
};
#endif /* !_SUMA_H_RPCGEN */
if(argc < 2) {
printf("usage: %s server_host\n", argv[0]);
exit(1);
}
host = argv[1];
/* Destruir el manejador */
clnt_destroy( clnt );
}
bool_t
xdr_argumentos (XDR *xdrs, argumentos *objp)
{
register int32_t *buf;
transp = svcudp_create(RPC_ANYSOCK);
svc_register(transp, SUMAR, SUMAVER, sumar_1, IPPROTO_UDP;
svc_run ();
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
case suma:
_xdr_argument = (xdrproc_t) xdr_argumentos;
_xdr_result = (xdrproc_t) xdr_int;
local = (char *(*)(char *, struct svc_req *)) suma_1_svc;
break;
case resta:
_xdr_argument = (xdrproc_t) xdr_argumentos;
_xdr_result = (xdrproc_t) xdr_int;
local = (char *(*)(char *, struct svc_req *)) resta_1_svc;
break;
default:
svcerr_noproc (transp); return;
}
Sockets RPC
Udp Tcp Udp Tcp
Local 2.2 ms 2.74ms 4,61 ms 5,43 ms
RPC:
1.http://www.cs.wustl.edu/~schmidt/PDF/rpc4.pdf
XDR data types and formats
1. http://pubs.opengroup.org/onlinepubs/9629799/chap3.htm