Desarrollo de Sistemas Distribuidos
Práctica 2
Programación RPC
Dpto. Lenguajes y Sistemas Informáticos
ETSI Informática y de Telecomunicación
Universidad de Granada
Departamento de Lenguajes y Sistemas Informáticos
Universidad de Granada
Índice
• Presentación de objetivos
• Comunicaciones entre procesos en sistemas distribuidos
Introducción
Sockets y RPC
• RPC
Objetivos
Modelo de llamadas remotas a procedimientos
Creación de Aplicaciones RPC
Compilación de Programas RPC
Ejecución de Programas RPC
• Ejercicio Propuesto
Objetivos
• Objetivo general:
En esta práctica se pretende que el alumno conozca y adquiera
experiencia en el manejo de los mecanismos para la
implementación de programas distribuidos con llamadas a
procedimientos remotos RPC (Remote Procedure Call)
• Objetivos específicos:
Conocer los mecanismos para definir interfaces a procedimientos
remotos
Aprender a implementar interfaces remotas y hacerlas accesibles
Implementar programas cliente y servidor basados en esta
tecnología
Compilar, desplegar y ejecutar los programas desarrollados
Resolver problemas de comunicación entre aplicaciones de
usuario
Objetivos
Enlaces a información complementaria
• RFC 1831: RPC Specification
https://www.ietf.org/rfc/rfc1831.txt?number=18
31
Introducción
• En sistemas distribuidos, programas que se
ejecutan en espacios de direcciones
diferentes, y posiblemente, equipos
diferentes, pueden necesitar comunicarse
unos con otros
5
Sockets y RPC
• Un mecanismo básico de comunicación es el basado en
sockets (enchufes). Esta tecnología requiere el
tratamiento de protocolos de bajo nivel para la
codificación y decodificación de los mensajes
intercambiados, lo que dificulta la programación y es más
proclive a errores.
6
Sockets y RPC
• Una alternativa a los sockets es RPC (Remote Procedure Call), que permite
abstraer e implementar las comunicaciones, como llamadas a
procedimientos convencionales (locales), pero posiblemente ejecutados en
máquinas remotas. La codificación, empaquetado y transmisión de
argumentos (proceso conocido como serialización o marshalling) se realiza
mediante algún protocolo estándar de formateo de datos, como XDR
(eXternal Data Representation).
• RPC resulta adecuado para programas basados en llamadas a
procedimientos.
7
¿Por qué sugió RPC?
• Procotocols orientados a funciones
Telnet, FTP
• No pueden ejecutar funciones con parámetros
“ejecuta la función Y con los prámetros X1, X2 en
la máquina Z”
» Necesitamos construir la interfaz del programa
RPC hace esto
de forma » Construir el entorno en tiempo real – formato de los
transparente comandos de salida, interfaz con red de
al programador comunicación, serializar la respuesta entrante
RPC – funcionamiento
client server
remoteFileSystemRead(“rutabaga”);
request
FileSystemRead(“rutabaga”);
computation
reply
https://cs162.eecs.berkeley.edu/
RPC Funcionamiento
bundle
args
Client call Client send Packet
(caller) Stub Handler
return receive
unbundle mbox2
ret vals
Network
Network
Machine A
Machine B
bundle
ret vals mbox1
Server return Server send Packet
(callee) Stub Handler
call receive
unbundle
args
http://inst.eecs.berkeley.edu/~cs162
RPC Stubs
• Stub cliente • Stub servidor
Tiene la misma Simula una llamada
interfaz que una local
función local Escucha en un socket
Agrupa los al stub del cliente
argumentos en un Desagrupa los
mensaje y lo envia al argumentos en
stub del servidor variables locales
Espera respuesta, Hace la llamada local
desagrupa resultados Agrupa el resultado en
Devuelve resultados al un mensaje para el
cliente cliente
RPC Sun
1. Identificación unívoca de procedimiento
3 Número de procedimiento
2 Número de versión
1 Número de programa
/etc/rpc guarda el número de programa con su nombre
RPC Sun
• Números de programas
RPC Sun
2. Selección de red
netpath. Variable que especifica el orden
para intentar los trasnportes (eg tcp:udp)
visible. Utiliza fichero /etc/netconfig, los que
tienen el flag v activado en orden de
aparición.
tcp
udp
RPC Sun
3. Directorio de servicios rpcbin. Enlace
dinámico (binding)
cs.uns.edu.ar/~sd/data/papers/Sobre_RPC-2010.pdf
RPC Sun
3. Directorio de servicios rpcbin. Enlace
dinámico (binding)
Asocia servicios con direcciones.
• Rpcbin está en el puerto 111
• Un servicio se registra
Borrar registros
Obtener dirección de un programa concreto
Listar direcciones de programas (rpcinfo –p)
Realizar una llamada remota a un cliente
Devolver la hora
RPC Sun
4. Varios niveles
Permite interactuar a varios niveles (ej. Nivel
bajo – encriptación). Nosotros no lo vamos a
usar, ya que usamos solo alto nivel con
rpcgen
5. XDR, representación externa de datos,
que permite interoperar con diferentes
arquitecturas
rpcgen
Definimos una interfaz, datos y
rutinas accesibles remotamente
interface.x Ejecutamos rpcgen
rpcgen
interface.h
_client.c interface_clnt.c interface_xdr.c interface_svc.c Server.c
(client stub) (Server stub)
Runtime lib
Client Server
Source: R. Stevens, Unix Network Programming
(IPC) Vol 2, 1998
rpcgen
Rpcgen genera automaticamente:
• Cabecera con definiciones comunes al
cliente y servidor *.h
• Rutinas xdr para los tipos de datos
definidos *_xdr.c. Convierten datos al
formato XDR y viceversa.
• Los stub del cliente y el servidor *_svc.c y
*_clnt.c
• Estructuras de los programas cliente y
servidor *_client.c y *_server.c
String = char * en C
Ejemplo
1. Crear
tipos
datos y
definir
funciones
remotas:
Mayúsculas
Ejemplo
2. Generar los stub, plantillas, etc.
Rpcgen –Nca dir.x
• (-N). Código estilo C = genera el código con los
argumentos pasados por valor (sin struct si hay
varios)
• Archivos plantilla
• (-C). Cógido ANSI-C o C++. Se usa junto con –N.
• (-M). Multithread. Código Multithread seguro. Para
entornos multihebras.
servidor
Añade (_1) número versión a la función Ejemplo
Puntero a un array de caracteres
(argumentos )
Rpcgen (SIN la opción –N).
Información
contexto;
programa, versión,
puntero a
información de
Estática. Para poder transporte
devolver un puntero y
que tenga sentido en la
máquina remota
Puntero a un entero
cliente
Ejemplo
Crea una estructura de
datos (handle) del
cliente, que es la que
Cualquier transporte (Tcp, pasa a la rutina del
udp) con el flag v en stub para llamar al
/etc/netconfig procedimiento remoto
Clnt_destroy liberará
memoria cuando ya no
se realicen más
llamadas
Libera memoria
asignada a la llamada
RPC, similar a free()
Ejemplo
• _xdr.c Hace la serialización con XDR.
En este ejemplo muestra una función
xdr_pointer() que sigue una cadena de punteros
y codifica el resultado en una cadena de bytes.
Solucionando el problema de pasar punteros del
espacio de direcciones de una máquina a otra
(en el cual no serían válidos).
Ejemplo
3. Compilación y enlazado
rpcgen genera un makefile
Make –f makefile.dir
gcc dir_client.c dir_clnt.c dir_xdr.c –o cliente –lnsl
gcc dir_server.c dir_svc.c dir_xdr.c –o servidor –lnsl
Siempre se ejecuta en libnsl contiene las funciones de red
segundo plano, sin
necesidad de invocarlo
con &
Ejemplo
4. Ejecutar servidor en una máquina
./servidor
5. Ejecutar cliente en otra (o en otro shell si es
en local)
./cliente <nombre_servidor> <parametros>
No es C
Lenguaje RPC Aunque se
parece mucho
• Es una extensión del lenguaje XDR
• Definiciones No son como las
declaraciones
No asignan espacio
Las variables necesitan ser declaradas
posteriormente
Lenguaje RPC
• Enumeraciones. Misma sintaxis que C.
RPC C
Lenguaje RPC
• Constantes
RPC C
• Definiciones de tipo
Lenguaje RPC RPC no soporta
declaraciones
de variables
• Declaraciones de tipos
Deben formar parte de un struct o typedef
RPC C
simple
Array fijo
Array variable
punteros
Lenguaje RPC
• Estructuras
RPC C
• Uniones
Lenguaje RPC
• Casos especiales
Booleano bool_t
Cadenas de caracteres (string) Longitud máxima
Datos opacos (sin tipo fijo)
Void. Solo en definiciones de union y programas
Calculadora
• Entrada:
<maquina> es la IP o nombre del servidor
<operador> puede ser + - * /
El cliente filtra la entrada, y llama a la
operación correspondiente del servidor
El servidor realiza la operación y devuelve el
resultado.
red1
equipo10 (IP 1.0)
DNS (Servidor DNS red1)
Nombre
Nombre
IP
IP
equipo11 1.1
equipo21 2.1
equipo12 1.2 Función DNS2
equipo22 2.2
… …
DNS red2 2.0
DNS red3 3.0
Función DNS3
equipo11 (IP 1.1) equipo12 (IP 1.2) equipo13 (IP 1.3)
DNS 1.0 DNS 1.0 DNS 1.0
red2 red3
equipo20 (IP 2.0) equipo30 (IP 3.0)
(Servidor DNS red2) (Servidor DNS red3)
Nombre IP Nombre IP
Función DNS1 equipo21 2.1 equipo31 3.1
equipo22 2.2 equipo32 3.2
… … … …
DNS red1 1.0 DNS red1 1.0
equipo21 (IP 2.1) equipo22 (IP 2.2) equipo23 (IP 2.3) equipo31 (IP 3.1) equipo32 (IP 3.2) equipo33 (IP 3.3)
DNS 2.0 DNS 2.0 DNS 2.0 DNS 3.0 DNS 3.0 DNS 3.0
DNS
• Necesitan ser cliente y servidor a la vez.
• Crear .x con la función DNS1 solo, para no
tener que modificar todos los códigos por
separado de todos los DNS
• En el .h añadir manualmente DNS2 y
DNS3 con sus número defunción
• En el servidor, cliente y stub se modifica
DNS1 por lo que necesitemos (DNS2,
DNS3)
• Compilar el servidor con el stub del cliente
(o con .o).
DNS
• El nombre de la máquina lo podeis hacer
Cadena caracteres: maquina2.red3
Dos valores: maquina2, red3
Ejercicio de listas enlazadas
ID = 0 ID = 1 ID=2
(teléfonos) (Aulas) diccionario
0 1 2
Juan DSD Coche
24555 1.5 car
Lucas
73455 Mesa
table