You are on page 1of 5

Prctica 3.

Llamadas a
procedimientos remotos. Sun-RPC
SCS, 2010/11

ndice General

Ejercicio 1: Compilacin y evaluacin de llamadas remotas


o Pasos a seguir
o Tareas a realizar
Documentacin a entregar

Ejercicio 1: Compilacin y evaluacin 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 evaluarn tambin las diferencias de rendimiento entre llamadas locales y
remotas.

Informacin sobre XDR (eXternal Data Representation)


RFC con la especificacin XDR

Se parte de un cdigo de ejemplo que implementa una ''calculadora remota''.


Descarga: rpc1.tar.gz
El cdigo de partida incluye:

calculadora.x: Especificacin XDR del interfaz remoto que exporta las cuatro

operaciones bsicas para enteros (suma, resta, multiplicacin y divisin)


servidor.c: Implementacin, conforme al esquema esperado por el skeleton de
Sun-RPC, de las 4 funciones exportadas
cliente.c: Ejemplo de cliente donde se muestra la forma en que realizan las
llamadas remotas a las funciones remotas exportadas.

Tareas a realizar
1. Comprobar las funciones, prototipos de funciones y estructuras de datos
presentes en los ficheros generados por rpcgen.
2. Se modifico el test_local que realizaba 100.000 mil llamadas remotas a una
funcin sumar_local, el cual se lo inserto en cliente y servidor.
3. Para ms detalle solo estudiar el cdigo.

calculadora.x
struct entrada {
int arg1;
int arg2;
};
program CALCULADORA {
version CALCULADORA_VER {
int sumar(entrada) = 1;
int restar(entrada) = 2;
int multiplicar(entrada) = 3;
int dividir(entrada) = 4;
int cien_mil_sumas(entrada) = 5;
} = 1;
} = 0x30000001;
servidor.c
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include "calculadora.h"
int * sumar_1_svc(entrada *argp, struct svc_req *rqstp) {
static int result;
printf("Servidor: Universidad Autonoma JUAN MISAEL
SARACHO.\n");
printf("Servidor: EJERCICIO 1: Compilacion y evaluacion de llamadas
remotas\n");
printf("SERVIDOR: invocacion de sumar con %d + %d\n", argp->arg1, argp>arg2);
result = argp->arg1 + argp->arg2;
return &result;
}
int * restar_1_svc(entrada *argp, struct svc_req *rqstp) {
static int result;
printf("SERVIDOR: invocacion de restar con %d - %d\n", argp->arg1, argp>arg2);
result = argp->arg1 - argp->arg2;
return &result;
}
int * multiplicar_1_svc(entrada *argp, struct svc_req *rqstp) {
static int result;
printf("SERVIDOR: invocacion de multiplicar con %d * %d\n", argp->arg1, argp>arg2);
result = argp->arg1 * argp->arg2;
return &result;

}
int * dividir_1_svc(entrada *argp, struct svc_req *rqstp) {
static int result;
printf("SERVIDOR: invocacion de dividir con %d / %d\n", argp->arg1, argp>arg2);
result = argp->arg1 / argp->arg2;
return &result;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Metodo que es invocado para realizar la suma desde cien mil sumas
int sumar_local (int a, int b){
return (a+b);
}
int * cien_mil_sumas_1_svc(entrada *argp, struct svc_req *rqstp){
int i,j;
static int result;
printf("........................................................\n");
printf("TAREAS A REALIZAR: 100.000 llamadas remotas a la funcion sumar\n");
printf("SERVIDOR: invocacion de cien mil sumas con %d y %d\n", argp->arg1, argp>arg2);
struct timeval tiempo_inicio, tiempo_final;
gettimeofday(&tiempo_inicio, 0);
printf("INICIO DEL PROGRAMA: %ld seg. y %ld microseg. \n",
(tiempo_inicio.tv_sec), (tiempo_inicio.tv_usec) );
// Bucle principal 100.000 sumas sera igual a 698
for (i=0; i < argp->arg1; i++){
for (j=0; j < argp->arg2; j++){
result=sumar_local(i,j);
}
}
gettimeofday(&tiempo_final, 0);
printf("FINAL DEL PROGRAMA: %ld seg. y %ld microseg. \n",
tiempo_final.tv_sec, tiempo_final.tv_usec);
printf("DIFERENCIA: %ld seg. y %ld microseg. \n", (tiempo_final.tv_sec tiempo_inicio.tv_sec)*1000000,(tiempo_final.tv_usec - tiempo_inicio.tv_usec) );
return &result;
}
////////////////////////////////////////////////////////////////////////////////////////////////
cliente.c
#include <stdio.h>
#include "calculadora.h"

int main(int argc, char ** argv) {


entrada parametros;

int * resultado;
char *host;
CLIENT *stub_cliente;
if (argc != 2) {
fprintf(stderr, "ERROR: formato incorrecto \ncliente nombre_servidor\n");
exit(1);
}
host = argv[1];
printf("\n........................................................");
printf("\nCLIENTE: creacion del \"stub\" para llamadas remotas a %s sobre TCP\n",
host);
stub_cliente = clnt_create (host, CALCULADORA, CALCULADORA_VER, "tcp");
if (stub_cliente == NULL) {
clnt_pcreateerror (host);
exit (1);
}
/* Establecer parametros */
parametros.arg1 = 500;
parametros.arg2 = 200;
printf("CLIENTE: llamada a sumar con %d y %d ", parametros.arg1,
parametros.arg2);
resultado = sumar_1(&parametros, stub_cliente);
if (resultado == (int *) NULL) {
clnt_perror (stub_cliente, "CLIENTE: fallo en llamada a sumar");
}
printf("devuelve %d \n", *resultado);
printf("CLIENTE: llamada a restar con %d y %d ", parametros.arg1,
parametros.arg2);
resultado = restar_1(&parametros, stub_cliente);
if (resultado == (int *) NULL) {
clnt_perror (stub_cliente, "CLIENTE: fallo en llamada a restar");
}
printf("devuelve %d \n", *resultado);
printf("CLIENTE: llamada a multiplicar con %d y %d ", parametros.arg1,
parametros.arg2);
resultado = multiplicar_1(&parametros, stub_cliente);
if (resultado == (int *) NULL) {
clnt_perror (stub_cliente, "CLIENTE: fallo en llamada a multiplicar");
}
printf("devuelve %d \n", *resultado);
printf("CLIENTE: llamada a dividir con %d y %d ", parametros.arg1,
parametros.arg2);
resultado = dividir_1(&parametros, stub_cliente);

if (resultado == (int *) NULL) {


clnt_perror (stub_cliente, "CLIENTE: fallo en llamada a dividir");
}
printf("devuelve %d \n", *resultado);
printf("CLIENTE: llamada a cien mil sumas con %d y %d ", parametros.arg1,
parametros.arg2);
resultado = cien_mil_sumas_1(&parametros, stub_cliente);
if (resultado == (int *) NULL) {
clnt_perror (stub_cliente, "CLIENTE: fallo en llamada a cien mil sumas");
}
printf("devuelve %d \n", *resultado);
printf("........................................................\n");
printf("Realizado por: MARIANA I. V. T.\n");
clnt_destroy (stub_cliente);
printf("CLIENTE DESCONECTADO\nPresione ENTER para continuar:\n\n");
}