You are on page 1of 80

Version 10/17/16

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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 2


Remote Procedure Call
RPC (Remote Procedure Call): llamadas a procedimientos
remotos
Por Birrel y Nelson (1985) en Implementing Procedure
Calls
Hbrido:
Llamadas a procedimientos en local
Paso de mensajes
Las RPC constituyen el ncleo de muchos SSDD
Llegaron a su culminacin con DCE (Distributed Computing
Environment)
Mecanismo para invocar procedimientos en espacios de
direcciones diferentes (en la misma o distinta mquina).
Soporta una variedad de estilos de comunicacin diferentes
Han evolucionado hacia orientacin a objetos
Invocacin de mtodos remotos (CORBA, RMI)

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 3


Consideraciones de
diseo
Bloqueantes vs. no bloqueantes
Con almacenamiento vs. sin almacenamiento
Fiables vs. no fiables
Caractersticas
Identificadores de mensajes
Timeouts
Mensajes de peticin duplicados
Mensajes de respuesta perdidos
Historia

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 4


Remote Procedure Call

Aplicaciones/servicios

RMI and RPC

Sockets
Aplanamiento (marshalling), representacin externa de
datos

Protocolo de transporte
UDP y TCP

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 5


Remote Procedure Call

RPCs en la pila de protocolos


RPC:
En el nivel de sesin en
OSI
En el nivel de
aplicacin en TCP/IP
Independientes del
protocolo de
transporte
TCP
UDP
Fiabilidad no
garantizada
Depende del protocolo
de transporte

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 6


RPC de Sun
La versin 2 de RPC, descrita en la RFC 1057, fue
estandarizada por Sun Microsystems
Se ocupa:
Especificacin e interpretacin de mensajes
NO se ocupa:
Cmo se realiza el intercambio de mensajes entre los procesos
Restricciones de la capa de transporte utilizado
Binding entre un cliente a un servicio

La sintaxis y el formato de los mensajes se define


mediante IDL (Interface Definition Language):
Lenguaje de especificacin de RPC
Lenguaje de especificacin de datos XDR

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 7


Funcionamiento de las RPCs
El proceso que realiza la llamada empaqueta los argumentos en
un mensaje, se los enva a otro proceso y espera el resultado

El proceso que ejecuta el procedimiento extrae los argumentos


del mensaje, realiza la llamada de forma local, obtiene el
resultado y se lo enva de vuelta al proceso que realiz la llamada

Objetivo: acercar la semntica de las llamadas a procedimiento


convencional a un entorno distribuido (transparencia)

main(){ sumar(int a, int b)



... receive(4,5) int r;
send(a, b);
r = sumar (4, 5); r = a + b;
receive(r);
... send (r) return r;

} }

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 8


Llamada local

main(){ Pila del proceso


...
r = sumar (4, 5);
...
}

sumar(int a, int b)
int r;
r = a + b;
return r;
} Dir retorno

a
Registro de activacin
b
r

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 9


Llamada a procedimiento
remoto
Cliente
main(){
...
r = sumar (4, 5);
...
}
Dir retorno
a
Stub sumar(int a, int b) b
send(a, b);
c
receive(r);
return(r); servidor
}
peticion main(){
receive (4, 5)...
r = sumar (4, 5);
send (r)
respuesta }

sumar(int a, int b) Stub


int r;
r = a + b;
return r;
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 10


Conceptos bsicos
Una RPC tiene dos participantes:
Un cliente activo, que enva una RPC al servidor
Un servidor pasivo, que calcula un resultado y lo devuelve al
cliente
Un servicio de red es una coleccin de uno o ms programas
remotos
Un programa remoto implementa uno o ms procedimientos
remotos
Un servidor puede soportar ms de una versin de un programa
remoto
Permite al servidor ser compatible con las actualizaciones de
protocolos
Un procedimiento remoto, sus parmetros y sus resultados se
especifican en un fichero de especificacin del protocolo escrito
en el lenguaje de especificacin de RPC y XDR

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 11


Suplentes (stubs) Cliente
Stub
Servidor
Stub

Se generan automticamente por el software de RPC


Stub del cliente
Stub del sevidor
Un stub es una pieza de cdigo usada en el cliente y el servidor

Responsable de convertir los parmetros de la aplicacin


cliente/servidor durante una llamada a procedimiento remoto
Espacio de direcciones independiente del cliente y servidor
Representaciones de datos diferentes (big-endian, little-endian)

Los suplentes son independientes de la implementacin que se


haga del cliente y del servidor.
Slo dependen de la interfaz

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 12


Suplentes (stubs) Cliente
Stub
Servidor
Stub

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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 13


Protocolos RPC
Request (R)
Called procedure returns nothing

Client does not wait for completion


Client does not require execution confirmation
No timeout nor retransmissions
Request-reply (RR)
Server reply is also an ACK for the client request

A new request is an ACK for the server reply


Client retransmits request if no reply arrives before
timeout.

Request/Reply/Ack-Reply protocol (RRA)


Client sends ACK for the server reply.
But only if all previous replies are received.

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 14


Protocolo request

Mquina cliente Mquina servidora

Proceso cliente Proceso servidor


(llamador) (llamado)
Protocolo
peticin
Stub Stub

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 15


Protocolo request
RPC asncrona
El cliente no espera la respuesta
No admite parmetros de salida
Ejemplo CORBA:
Se corresponden con mtodos especificados como
oneway
cliente servidor
localizar al Se registra en un
servidor servicio de nombres
preparar
parmetros,
enviar peticin Recibir la peticin
Ejecutar el
procedimiento

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 16


Protocolo request-reply

Solicitar Mensaje de peticin


operacin Recibir peticin
Seleccionar servicio
(esperar)
Ejecutar servicio
Mensaje de respuesta
Enviar respuesta
(contina)

Cliente Servidor

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 17


Estructura de los mensajes de
peticin-respuesta

Id. De peticin
Id. De operacin

argumentos

Resultado

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 18


Protocolo request-reply

localizar al cliente servidor


servidor Se registra en un
servicio de nombres
preparar
parmetros,
enviar peticin Recibir la peticin
Ejecutar el
procedimiento

Preparar la respuesta
Desempaquetar y enviar
la respuesta

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 19


Protocolo request-reply

Proceso cliente (llamador)


Conectar al servidor
Mquina cliente Invocar una llamada a
procedimiento remoto
Proceso cliente Stub o resguardo del cliente:
(llamador)
Localizar al servidor
Empaquetar los parmetros
Stub y construir los mensajes
Enviar los mensajes al
servidor
Bloquearse hasta esperar la
respuesta
Obtener la respuesta

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 20


Protocolo request-reply

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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 21


Consideraciones de
diseo
Lenguaje de definicin de interfaces (IDL)
Generador de stubs
Tipos de parmetros
Transferencia de parmetros
Protocolo de comunicacin
Enlace entre el cliente y el servidor (binding)
Semntica de las RPC en presencia de fallos

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 22


Lenguaje de Definicin
de Interfaz
Un Lenguaje de Definicin de Interfaz (IDL) permite
especificar el formato de los procedimientos remotos y otras
opciones de comunicacin
Cliente

La interfaz es compartida por


Stub
Cliente Servidor

Servidor
Stub

<opciones de comunicacin:
versin interfaz, tcp/udp,
>
<interfaz remota:
suma (in int a, in int b, out int c) ;
generador
>
STUB

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 23


Lenguaje de Definicin
de Interfaz
Una interfaz especifica:
Nombre de servicio que utilizan los clientes y servidores
Nombres de procedimientos
Parmetros de los procedimientos
Entrada
Salida
Tipos de datos de los argumentos

Los compiladores pueden disearse para que los clientes y


servidores se escriban en lenguajes diferentes
Tipos de IDL
Integrado con un lenguaje de programacin (Cedar, Argus)
Lenguaje de definicin de interfaces especfico para describir las
interfaces entre los clientes y los servidores (RPC de Sun y RPC de
DCE)

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 24


Tipos de parmetros
Parmetro de entrada (in)
El parmetro se enva del cliente al servidor
Parmetro de salida (out)
El parmetro se enva del servidor al cliente
Parmetro de entrada/salida (inout)

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 25


Transferencia de
paametros
Una de las funciones de los suplentes es empaquetar
los parmetros en un mensaje: aplanamiento
(marshalling)
Problemas en la representacin de los datos:
Servidor y cliente pueden ejecutar en mquinas con
arquitecturas distintas (ordenamiento de bytes)
Problemas con los punteros
Una direccin slo tiene sentido en un espacio de direcciones

Ejemplos de esquemas de representacin de datos:


XDR (eXternal Data Representation) es un estndar que
define la representacin de tipos de datos (RFC 1832)
Representacin comn de datos de CORBA (CDR)
Serializacin de objetos de Java
XML (eXtensible Markup Language ) es un metalenguaje
basado en etiquetas definida por W3C

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 26


Ejemplo de
representacin de datos
Mensaje: Smith, London, 1934
XDR CDR
indexin notes
sequenceofbytes 4bytes

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 >

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 27


Protocolo
Entre cliente y servidor debe establecerse un
protocolo:
Formato de los mensajes
Formato de representacin

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 28


Enlace (binding)
Enlace: asociacin entre el cliente y el servidor
Implica localizar al servidor que ofrece un determinado
servicio
El servidor debe registrar su direccin en un servicio
de nombres (binder)

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 29


Enlazador dinmico
Enlazador dinmico (binder): es el servicio que
mantiene una tabla de traducciones entre nombres de
servicio y direcciones.
Incluye funciones para:
Registrar un nombre de servicio
Eliminar un nombre de servicio
Buscar la direccin correspondiente a un nombre de servicio

Cmo localizar al enlazador dinmico:


1. Ejecuta en una direccin fija de un computador fijo
2. El sistema operativo se encarga de indicar su direccin
3. Difundiendo un mensaje (broadcast) cuando los procesos
comienzan su ejecucin.

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 30


Esquema de registro y
enlace
5

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)

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 31


Tipos de enlace
Enlace no persistente: el binding entre el cliente
y el servidor se establece en cada RPC
Ms tolerante a fallos
Permite migracin de servicios

Enlace persistente: el binding se mantiene


despus de la primera RPC
til en aplicaciones con muchas RPC repetidas
Problemas si lo servidores cambian de lugar

Modelos hbridos

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 32


Fallos que pueden
aparecer en las RPCs
El cliente no es capaz de localizar al servidor
Prdidas de mensajes
Se pierde el mensaje de peticin del cliente al
servidor
Se pierde el mensaje de respuesta del servidor al
cliente
El servidor falla despus de recibir una peticin
El cliente falla despus de enviar una peticin

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 33


Cliente no puede
localizar al servidor
Posibles causas:
El servidor puede estar cado
El cliente puede estar usando una versin antigua del
servidor
La versin ayuda a detectar accesos a copias obsoletas

Cmo indicar el error al cliente


Devolviendo un cdigo de error (-1)
No es transparente
Ejemplo: sumar(a,b)
Elevando una excepcin
Necesita un lenguaje que tenga excepciones

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 34


Prdida de mensajes del
cliente
Es la ms fcil de tratar
Se activa una alarma (timeout) despus de enviar
el mensaje
Si pasado el timeout no se recibe una respuesta
se retransmite el mensaje

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 35


Prdida del mensaje de
respuesta
Ms difcil de tratar
Se pueden emplear alarmas y retransmisiones, pero:
Se perdi la peticin?
Se perdi la respuesta?
El servidor va lento?

Algunas operaciones pueden repetirse y devolvern el mismo


resultado (operaciones idempotentes)
Una transferencia bancaria no es idempotente
La suma de dos nmeros es idempotente

La solucin con operaciones no idempotentes es descartar


peticiones ya ejecutadas
Un nmero de secuencia en el cliente
Un campo en el mensaje que indique si es una peticin
original o una retransmisin

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 36


Fallos en los servidores
El servidor no ha llegado a ejecutar la operacin
Se podra retransmitir
El servidor ha llegado a ejecutar la operacin
El cliente no puede distinguir los dos
Qu hacer?
No garantizar nada
Semntica al menos una vez
Reintentar y garantizar que la RPC se realiza al menos una vez
No vale para operaciones no idempotentes
Semntica a lo ms una vez
No reintentar, puede que no se realice ni una sola vez
Semntica de exactamente una
Sera lo deseable

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 37


Invocation Semantics
maybe: not ACK, not dup filter
Remote procedure may run one or zero
Client may get reply or not
at-least-once: ACK, no dup filter
Remote procedure run one or more
Client may get one or more replies
at-most-one: ACK, dup filter + reply retransmission
Remote procedure run one or zero
Client get a reply or an error
exactly-one
Not possible
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 38
Fallos en los clientes
La computacin est activa pero ningn cliente
espera los resultados (computacin hurfana)
Gasto de ciclos de CPU
Si el cliente rearranca y ejecuta de nuevo la RPC se
pueden crear confusiones

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 39


Estrategias ante fallos
Cliente RPC:
Cuando no se recibe la respuesta
Reenviar la peticin
Incluir identificador de peticin (nmero de secuencia)

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.

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 40


Aspectos de
implementacin
Protocolos RPC
Orientados a conexin
Fiabilidad se resuelve a bajo nivel
Peor rendimiento
No orientados a conexin
Uso de un protocolo estndar o uno especfico
Algunos utilizan TCP o UDP como protocolos bsicos

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 41


Programacin con RPCs
El programador debe proporcionar:
La definicin de la interfaz (IDL)
Nombres de los procedimientos
Parmetros que el cliente pasa al servidor
Resultados que devuelve el servidor al cliente
El cdigo del cliente
El cdigo del servidor

El compilador de IDL genera :


El resguardo (stub) del cliente
El resguardo (stub) del servidor

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 42


Programacin con RPCs
FICHERO
DESARROLLO DE DEFINICIN
DE LA DE INTERFAZ
INTERFAZ
COMPILADOR IDL

SUPLENTE CABECERA SUPLENTE


EN CLIENTE EN SERVIDOR

FICHEROS CABECERA CABECERA


FICHEROS
FUENTE DEL FUENTE DEL
COMPILADOR C CLIENTE SERVIDOR COMPILADOR C

COMPILADOR C COMPILADOR C

OBJETO FICHEROS FICHEROS OBJETO


SUPLENTE OBJETO DEL BIBLIOT. BIBLIOT. OBJETO DEL SUPLENTE
EN CLIENTE CLIENTE RPC RPC SERVIDOR EN SERVIDOR

MONTADOR MONTADOR

EJECUTABLE EJECUTABLE
DESARROLLO DEL DESARROLLO
DEL
DEL CLIENTE SERVIDOR
CLIENTE SERVIDOR

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 43


RPCs de Sun
Microsystems
Diseado para el sistema de ficheros NFS
Descrito en RFC 1831
Tambin se denomina ONC-RPC (Open network computing)
Se puede elegir UDP o TCP
Cliente y servidor deben estar de acuerdo en el protocolo de
transporte a utilizar
Utiliza la semntica al menos una vez
Utiliza un lenguaje de definicin de interfaces denominado XDR
Soporte:
Para C a travs del compilador rpcgen en UNIX/Linux
Para Java
http://acplt.plt.rwth-aachen.de/ks/english/remotetea.html
Para plataformas Windows

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 44


RPCs de Sun en el
modelo OSI
7. Aplicacin aplicacin
aplicacin

6. Presentacin XDR
XDR

5. Sesin RPC
RPC

4. Transporte
TCP
TCP UDP
UDP

3. Red IP
IP

1-2 Enlace de datos Interfaz


InterfazHW
HW
Y fsico
RED

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 45


Lenguaje XDR
XDR (eXternal Data Representation) es un estndar que define la
representacin de tipos de datos (RFC 1832)
Utilizado inicialmente para representaciones externas de datos
Se extendi a lenguajes de definicin de interfaces
Una interfaz contiene:
Un nmero de programa
Un nmero de versin del programa
Un conjunto de procedimientos remotos:
Un nombre y un nmero de procedimiento
Los procedimientos slo aceptan un parmetro de entrada (se encapsulan en
una estructura)
Los parmetros de salida se devuelven mediante un nico resultado

El lenguaje ofrece una notacin para definir:


constantes
definicin de tipos
estructuras, uniones
programas

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 46


Formato de definicin de
interfaz
program-def:
"program" identifier "{"
version-def
version-def *
"}" "=" constant "; /* Number of program */
version-def:
"version" identifier "{"
procedure-def
procedure-def *
"}" "=" constant ";" /* Number of version */
procedure-def:
type-specifier identifier "(" type-specifier
("," type-specifier )* ")"
"=" constant "; /* Number of procedure */

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 47


Ejemplo: programa ping
/* Simple ping program */
program PING_PROG {
/* Latest and greatest version */
version PING_VERS_PINGBACK {
void
PINGPROC_NULL(void) = 0;
/*
* Ping the caller, return the round-trip time (in microseconds).
Returns -1 if the operation timed out.
*/
int
PINGPROC_PINGBACK(void) = 1;
} = 2;
/* Original version */
version PING_VERS_ORIG {
void
PINGPROC_NULL(void) = 0;
} = 1;
} = 1;
const PING_VERS = 2; /* latest version */

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 48


Identificacin de
llamadas a RPC
Un mensaje de llamada de RPC se identifica
unvocamente mediante tres campos enteros sin
signo:
(NUM-PROG, NUM-VERSION, NUM-PROCEDURE)
NUM-PROG es el nmero de programa remoto,
NUM-VERSION es el nmero de versin de programa,
NUM-PROCEDURE es el nmero de procedimiento remoto

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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 49


El proceso portmapper
El enlace en las RPC de sun se realiza mediante un proceso denominado
portmapper
En cada servidor ejecuta un proceso portmapper en un puerto bien
conocido (111)
El portmapper almacena por cada servicio local:
El nmero de programa
El nmero de versin
El nmero de puerto
Enlace dinmico:
El nmero de puertos disponibles es limitado y el nmero de programas
remotos potenciales puede ser muy grande
Slo el portmapper ejecutar en un puerto determinado (111) y los nmeros
de puertos donde escuchan los servidores se averiguan preguntando al
portmapper
Soporta TCP y UDP (ver /etc/services)
sunrpc 111/tcp portmapper #RPC4.0portmapper

sunrpc 111/udp portmapper

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 50


El proceso portmapper
Protocolo:
Cuando un servidor arranca registra en el portmapper la
informacin anterior
Cuando un cliente necesita invocar un procedimiento remoto
enva al portmapper del host remoto (necesita conocer la
direccin IP del servidor)
El nmero de programa y el nmero de versin
El portmapper devuelve el puerto del servidor

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 51


El proceso portmapper

./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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 52


Biblioteca de funciones
de RPC
La biblioteca de funciones de RPC
Sistemas Unix
Servicios de RPC para construir aplicaciones
En el cliente
Crear un manejador de cliente
Destruir un manejador de cliente
En el servidor

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 53


Biblioteca de funciones
de RPC
rpc.h es una biblioteca de funciones para
desarrollar aplicaciones distribuidas que usan
RPC:
#include <rpc/rpc.h>

Mltiples niveles de acceso:


Interfaz simplificado
Rutinas de nivel intermedio
Rutinas de alto nivel

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 54


Servicios de RPC
Crear un manejador para el cliente
CLIENT *
clnt_create (const char *host, const u_long prognum, const
u_long versnum, const char *nettype)

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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 55


Servicios de RPC
Destruir el manejador del cliente
void clnt_destroy (CLIENT *clnt)

Argumentos:
clnt Manejador de RPC del cliente

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 56


Servicios de RPC
Indicar el error en un fallo de RPC:
void clnt_perror (CLIENT *clnt, char *s)
void clnt_pcreateerror (CLIENT *clnt, char *s)

Argumentos:
clnt Manejador de RPC del cliente
s Mensaje de error

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 57


Ejemplo: crear/destruir
un manejador
#include <stdio.h>
#include <rpc/rpc.h>
#define RMTPROGNUM (u_long)0x3fffffffL /* Define remote program number and version */
#define RMTPROGVER (u_long)0x1
main()
{
CLIENT *client; /* client handle */

/* Crear el manejador del cliente */


client = clnt_create(as400.somewhere.ibm.com, RMTPROGNUM, RMTPROGVER, TCP);
if (client == NULL){
clnt_pcreateerror(client, Could not create client\n);
exit(1);
}
// Invocar procedimiento remoto
/* Destruir el manejador del cliente */
clnt_destroy(client);
exit(0);
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 58


Invocar un procedimiento
Un procedimiento remoto se invoca:
tipo_resultado procedimiento_v (tipo_arg1 arg1,
tipo_arg2 arg2,

tipo_argn argn,
CLIENT *clnt)
donde:
procedimiento_vNombre del procedimiento a invocar
arg1,arg2,,argn Argumentos del procedimiento
clnt Manejador de un cliente de RPC

NOTA: v se sustituye por el nmero de versin que se invoca

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 59


Implementar un
procedimiento (servidor)
Para cada procedimiento remoto, el servidor ofrece
una implementacin de procedimiento respetando su
prototipo:
tipo_resultado
procedimiento_v_svc (tipo_arg1 arg1,
tipo_arg2 arg2,

tipo_argn argn,
struct svc_req *rqstp)
donde:
procedimiento_v_svc
Nombre del procedimiento a
implementar
arg1,arg2,,argn Argumentos del procedimiento
rqstp Estructura que contiene informacin de
la peticin
NOTA: v se sustituye por el nmero de versin que se implementa

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 60


Compilador de interfaces
rpcgen es el compilador de interfaces que genera
cdigo C para:
Stub del cliente
Stub del servidor y procedimiento principal del
servidor
Procedimientos para el empaquetado y
desempaquetado XDR
Fichero de cabecera (.h) con los tipos y declaracin de
prototipos de procedimientos

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 61


rpcgen
Compilar usando rpcgen
rpcgen infile
rpcgen [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
rpcgen [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
rpcgen [-s nettype]* [-o outfile] [infile]
rpcgen [-n netid]* [-o outfile] [infile]

infile fichero en lenguaje de definicin de interfaz de


RPC (XDR en RPC de SUN)

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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 62


Ejemplo: sumar dos
nmeros

Mquina A Mquina B
sumar(5,2)
cliente servidor
5+2

NCLEO Resultado = 7 NCLEO

RED

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 63


Esquema de la aplicacin
cliente.c
Archivos para
el cliente
suma_clnt.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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 64


Esquema de la aplicacin
cliente.c
Archivos para
el cliente
suma_clnt.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

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 65


suma.x
struct argumentos {
int a;
int b;
};

program SUMAR {
version SUMAVER {
int SUMA(argumentos) = 1;
int RESTA(argumentos) = 2;
} = 1;
} = 99;

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 66


suma.h
#ifndef _SUMA_H_RPCGEN
#define _SUMA_H_RPCGEN

#include <rpc/rpc.h>
struct argumentos {
int a;
int b;
};

#define SUMAVER ((u_long)99)


#define SUMA ((u_long)1)
#define RESTA ((u_long)2)
extern int * suma_1(argumentos *, CLIENT *);
extern int * suma_1_svc(argumentos *, struct svc_req *);
...

#endif /* !_SUMA_H_RPCGEN */

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 67


servidor.c
#include "suma.h"

int *suma_1_svc(argumentos *argp, struct svc_req *rqstp)


{
// TODO: implementacin del procedimiento suma_1_svc
static int result;
result = argp->a + argp->b;
return(&result);
}
int *resta_1_svc(argumentos *argp, struct svc_req *rqstp)
{
// TODO: implementacin del procedimiento resta_1_svc
static int result;
result = argp->a - argp->b;
return(&result);
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 68


cliente.c
#include "suma.h"
#include <rpc/rpc.h>

main( int argc, char* argv[] )


{
CLIENT *clnt;
int *res;
argumentos suma_1_arg;
char *host;

if(argc < 2) {
printf("usage: %s server_host\n", argv[0]);
exit(1);
}
host = argv[1];

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 69


cliente.c
/* Paso 1: localizar al servidor */
clnt = clnt_create(host, SUMAR, SUMAVER, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host); Binding:
exit(1); Se contacta con el portmapper de host
} Se indica el host:API:versin:protocolo
El portmapper indica la localizacin
suma_1_arg.a = 5; (puerto)
suma_1_arg.b = 2;

/* Paso 2: Invocar el procedimiento remoto */


res = suma_1(&suma_1_arg, clnt);
if (res == NULL) {
clnt_perror(clnt, "call failed:");
}
printf("La suma es %d\n", *res);

/* Destruir el manejador */
clnt_destroy( clnt );
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 70


suma_xdr.c
#include "suma.h"

bool_t
xdr_argumentos (XDR *xdrs, argumentos *objp)
{
register int32_t *buf;

if (!xdr_int (xdrs, &objp->a))


return FALSE;
if (!xdr_int (xdrs, &objp->b))
return FALSE;
return TRUE;
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 71


suma_clnt.c Cliente

(stub del cliente) Stub


Servidor
Stub

#include <memory.h> /* for memset */


#include "suma.h"

/* Default timeout can be changed using clnt_control() */


static struct timeval TIMEOUT = { 25, 0 };

int * suma_1(argumentos *argp, CLIENT *clnt)


{
static int clnt_res;

memset((char *)&clnt_res, 0, sizeof(clnt_res));


if (clnt_call (clnt, suma,
(xdrproc_t) xdr_argumentos, (caddr_t) argp,
(xdrproc_t) xdr_int, (caddr_t) &clnt_res,TIMEOUT) != RPC_SUCCESS)
{
return (NULL);
}
return (&clnt_res);
}
int * resta_1(argumentos *argp, CLIENT *clnt)...

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 72


suma_svc.c Cliente

(stub del servidor) Stub


Servidor
Stub

int main (int argc, char **argv)


{
register SVCXPRT *transp;
pmap_unset (SUMAR, SUMAVER);

transp = svcudp_create(RPC_ANYSOCK);
svc_register(transp, SUMAR, SUMAVER, sumar_1, IPPROTO_UDP;

transp = svctcp_create(RPC_ANYSOCK, 0, 0);


svc_register(transp, SUMAR, SUMAVER, sumar_1, IPPROTO_TCP;

svc_run ();

fprintf (stderr, "%s", "svc_run returned");


exit (1);
/* NOTREACHED */
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 73


suma_svc.c Cliente

(stub del servidor) Stub


Servidor
Stub

static void sumar_1(struct svc_req *rqstp, register SVCXPRT *transp)


{
union {
argumentos suma_1_arg;
argumentos resta_1_arg;
} argument;

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;

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 74


suma_svc.c Cliente

(stub del servidor) Stub


Servidor
Stub

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;
}

memset ((char *)&argument, 0, sizeof (argument));


svc_getargs (transp, _xdr_argument, (caddr_t) &argument);
result = (*local)((char *)&argument, rqstp);

if (result != NULL &&


!svc_sendreply(transp, _xdr_result, result)){
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
return;
}

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 75


Compilar la interfaz
rpcgen a N M suma.x
Opciones:
-a: genera todos los ficheros incluyendo ejemplos
-N: permite varios argumentos
-M: genera cdigo multithread (cdigo que puede ser
utilizado en aplicaciones con varios threads)

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 76


Compilar
gcc c suma_xdr.c
gcc c suma_svc.c
gcc c suma_clnt.c
gcc c cliente.c
gcc c servidor.c

gcc suma_xdr.o suma_clnt.o cliente.o o cliente


gcc suma_xdr.o suma_svc.o servidor.o o servidor

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 77


Evolucin de las RPCs

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 78


Rendimiento: sockets vs.
RPCs
Rendimiento de sockets y RPC. Incluye todo el
tiempo. Enlace, conexin en sockets, etc.

Sockets RPC
Udp Tcp Udp Tcp
Local 2.2 ms 2.74ms 4,61 ms 5,43 ms

Remoto 6.8 ms 7.35 ms 8.21 ms 8.77 ms

Sistemas Distribuidos - Llamadas a Procedimiento Remoto 79


References
G. Coulouris, Distributed Systems: Concepts
and Design, Addison Wesley 2011, Fifth edition
Section 5.3 Remote Procedure Call
A.D.BIRRELL, B.J. NELSON, Implementing Remote
Procedure Calls, Xerox PARC
Ejemplo:
1. http://docs.oracle.com/cd/E19683-01/816-1435/rpcgenpguide-21470/index.html

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

Sistemas Distribuidos - Llamadas 80

You might also like