Ejercicios Tema 6 . Llamadas a procedimientos remotos Ejercicio 1. En un sistema con RPC: ¿cuál es la función del binder (servidor de nombres, enlazador dinámico)? ¿Cuáles son los servicios que deber ofrecer? ¿Cómo utilizan dichos servicios el suplente del cliente y del servidor? ¿Qué diferencias existen entre un servidor de ficheros con estado y uno sin estado? ¿Qué es una operación autocontenida? ¿En que tipo de servidores de ficheros se utiliza (con estado o sin estado)? ¿Por qué? ¿Qué es una operación idempotente? ¿En qué consiste la semántica de coutilización UNIX? ¿Como intenta NFS asegurar dicha semántica? 1. 2. 3. 4. 5. Ejercicio 2. Defina las operaciones típicas de un servidor de nombres utilizando como lenguaje de definición de interfaces (IDL), el utilizado en las RPC de SUN. Ejercicio 3. Se desea implementar un servicio de correo electrónico mediante una arquitectura cliente-servidor. El servicio ofrece la siguiente funcionalidad: • • • Registrar un usuario: esta función permite a un usuario registrar una cuenta de correo electrónico en un servidor. Un usuario solo puede acceder a las funcionalidades del servidor de correo en caso de estar registrado previamente. Enviar un correo electrónico: el cliente puede enviar un correo electrónico a otro usuario. En caso de que el destinatario se encuentre registrado en el mismo servidor, almacenará el mensaje en el buzón del destinatario. De lo contrario, el servidor se encargará del reenvío del mensaje al servidor destino correspondiente. Solicitar un correo electrónico: esta función devuelve el correo electrónico más antiguo almacenado en el servidor, eliminándolo del mismo. En caso de no existir ningún mensaje, el servidor indicará este hecho al cliente. Los mensajes de correo electrónico contienen los siguientes elementos: Nombre del cliente Servidor del cliente Nombre del destino Servidor del destino Asunto Mensaje Adjunto Todos los campos, excepto el adjunto, son campos de texto. El mensaje puede ser de tamaño variable. Se puede adjuntar el contenido de un único fichero al mensaje, si bien puede aparecer de forma opcional en el mensaje. El tamaño de los datos también es variable. Se pide: a) Programe utilizando las RPC de SUN, la interfaz del servicio entre el cliente y el servidor (fichero .x). b) Utilizando el lenguaje C, implemente un programa cliente que permita enviar un correo electrónico (sin adjunto) a un servidor, considerando que se pasan en la línea de mandatos del programa los siguientes campos: • Nombre del cliente • Servidor del cliente • Nombre del destino • Servidor del destino • Asunto • Mensaje c) Utilizando el lenguaje C, implemente un programa cliente que liste los asuntos de todos los mensajes disponibles en el servidor. El programa recibirá en la línea de mandatos los siguientes campos: • Nombre del cliente • Servidor del cliente Ejercicio 4. El servidor Gestor_BD proporciona dos servicios cuyos prototipos en C son: int fijar_valor (int item, char valor[]); int obtener_valor(int item, char valor[]); En C los vectores se pasan por referencia. Para poder acceder a estos servicios mediante el mecanismo de RPC, se realiza una especificación del servidor utilizando un hipotético lenguaje de especificación de IDL. Gestor_BD, version 3 int fijar_valor(in int item, in char valor[20]); int obtener_valor(in int item, out char valor[20]): A partir de esta especificación un compilador de IDL genera de forma automática los resguardos del cliente y del servidor. Estos resguardos utilizan las siguientes primitivas de comunicación síncronas para comunicarse entre si: send(&mensaje, longirud, direccion_destino); receive(&mensaje, &longitud, &direccion_remitente); Además se utiliza un esquema de enlace dinámico basado en un binder cuyas operaciones son accesibles a cada máquina mediante una biblioteca que proporciona las siguientes operaciones: dar_de_alta(nombre_de_servicio, version, direccion_servidor); dar_de_baja(nombre_servicio,version); buscar(nombre_de_servicio, version) devueve la direccion del servidor. Se pide a) programar en C el código de los resguardos del cliente y del servidor. Ejercicio 5. Dada la siguiente especificación de procedimiento remoto procedure REMOTO (in int A, inout int B, out int C) Suponiendo que se dispone de las primitivas de comunicación cliente/servidor con las siguientes especificaciones y semánticas: void sendrecv(port p, char *buffer, int *bufsize); Permite a un proceso enviar al puerto p un mensaje con lo que hay en el buffer de tamaño bufsize. A continuación el proceso se queda bloqueado en espera del resultado del servicio. Cuando el proceso se desbloquea se encuentra el resultado en buffer y bufsize indica el tamaño del buffer resultado. void receive(por p, char *buffer, int *bufsize); Permite a un proceso recibir un mensaje por el puerto p. El proceso se bloquea hasta que el mensaje llegue. El mensaje se almacena en buffer y bufsize indica el tamaño del buffer resultado. void reply(char *buffer, int *bufsize); Permite devolver un resultado en buffer con tamaño bufsize al proceso del que se recibió el último mensaje. port createport(); Permite obtener un puerto único identificable en todo el sistema distribuido. Suponiendo que el binder (servidor de nombres, enlazador) ofrece tres RPC cuyas especificaciones son: registrar(in char nombre[longmax], int port p); buscar(in char nombre[longmax], out port p); borrar(in char nombre[longmax); Sabiendo que nos encontramos en un sistema homogéneo, se pide: a) Diseñar y programar el suplente del cliente del procedimiento REMOTO, especificando la secuencia de funciones que debe realizar y las estructuras de datos que utiliza. b) Diseñar y programar el suplente del servidor, especificando la secuencia de funciones que debe realizar y las estructuras de datos que utiliza. El diseño del servidor sólo debe considerar que se atiende una petición en cada momento. c) Indicar si ha sido necesario un cambio de representación de los parámetros y porqué. d) ¿Se puede utilizar un servidor concurrente? NOTA: no es necesario considerar aspectos de seguridad ni tratamientos de error.