Práctica 3. Llamadas a procedimientos remotos. Sun-RPC

SCS, 2010/11


Índice General

Ejercicio 1: Compilación y evaluación de llamadas remotas

Se mostrará el uso del IDL de Sun-RPC (XDR), el funcionamiento del compilador de interfaces (rpcgen) y el desarrollo de clientes y servidores que hagan uso de las llamadas remotas. Se evaluarán también las diferencias de rendimiento entre llamadas locales y remotas.

Se parte de un código de ejemplo que implementa una ''calculadora remota''.

Descarga: rpc1.tar.gz

El código de partida incluye:

Pasos a seguir

  1. Descomprimir el paquete.
    $ tar xzvf rpc1.tar.gz
    $ cd rpc1
    

  2. Comprobar el contenido del fichero calculadora.x con el interfaz remoto

  3. Compilar con rpcgen la definición del interfaz remoto
    $ rpcgen calculadora.x
    

    Se generan los siguientes ficheros.

    Se peuden abrir con un editor y comprobar su estructura, las definciones de tipos de datos, los prototipos de las funciones del stub y ver cómo son las llamadas realizadas en stub y skeleton.

  4. Compilar y lanzar el servidor
    $ gcc -o servidor servidor.c calculadora_svc.c calculadora_xdr.c
    $ ./servidor &
    
    Se pueden comprobar los programas RPC registrados en el portmapper de una máquina con la orden rpcinfo.
    $ rpcinfo -p
    
    Muestra el núm. de programa (en decimal) junto su núm. de versión [ambos especificados en el fichero XDR calculadora.x] y sus puertos de escucha (tcp y udp).

  5. Compilar y ejecutar el cliente de ejemplo (en un terminal distinto)
    $ gcc -o cliente cliente.c calculadora_clnt.c calculadora_xdr.c
    $ ./cliente localhost &
    
    Se puede probar a ejecutar las funciones remotas de otra máquina del laboratorio poniendo su dirección IP en lugar de ''localhost''

Tareas a realizar

  1. Comprobar las funciones, prototipos de funciones y estructuras de datos presentes en los ficheros generados por rpcgen

  2. Generar con rpcgen -a calculadora.x los prototipos de cliente y servidor (calculadora_server.c, calculadora_client.c) y compararlos con las implementaciones aportadas.

  3. Evaluar el rendimiento de las llamadas remotas comparándolo con el de las llamadas locales.

Ejercicio 2: Uso de tipos complejos en interfaces remotos

Se parte de un código de ejemplo que implementa una serie de procedimientos remotos para el procesamiento de vectores:

Descarga: rpc2.tar.gz

Pasos a seguir

  1. Descomprimir el paquete.
    $ tar xzvf rpc2.tar.gz
    $ cd rpc2
    
  2. Contenido Revisar el fichero vector.x y sus declaraciones de datos.

  3. Compilar con rpcgen la definición del interfaz remoto
    $ rpcgen vector.x
    
    Genera los siguientes ficheros.

  4. Generar los ejecutables del servidor y del cliente y ejecutarlos
    $ gcc -o servidor_vector servidor_vector.c vector_svc.c vector_xdr.c
    $ gcc -o cliente_vector cliente_vector.c vector_clnt.c vector_xdr.c
    $ ./servidor_vector &
    $ ./cliente_vector localhost
    

Tareas a realizar

Se tratará de extender el interfaz remoto con una nueva operación de vectores, el producto escalar de 2 vectores.

Pasos:

  1. Modificar el interfaz XDR ''vector.x'' para incluir un nuevo procedimiento producto_escalar
  2. Compilar el nuevo interfaz con rpcgen
          $ rpcgen vector.x
    

    Idea: Se puede usar rpcgen -a vector.x y comprobar como será el prototipo de la nueva función a implementar/llamar en vector_server.c y vector_client.c.

  3. Incluir en servidor_vector.c la implementación del método producto_escalar_1_svc()
          float * producto_escalar_1_svc(entrada2 *argp, struct svc_req *rqstp) {
             static float  result;
             ...
             return &result;
          }
    

  4. Incluir en cliente_vector.c la llamada al método producto_escalar_1()
          float * resultado2;
          ...
          resultado2 = producto_escalar_1(&args2, clnt);
          ...
          printf("Resultado: %f\n", *resultado2);
          

  5. Compilar cliente y servidor y comprobar su funcionamiento
    $ gcc -o servidor_vector servidor_vector.c vector_svc.c vector_xdr.c
    $ gcc -o cliente_vector cliente_vector.c vector_clnt.c vector_xdr.c
    $ ./servidor_vector &
    $ ./cliente_vector localhost
    

Documentación a entregar



ribadas 2010-11-16