Академический Документы
Профессиональный Документы
Культура Документы
Sun-RPC
SOLUCION A EJERCICIO # 2
SCS, 2010/11
ndice General
Ejercicio 2: Uso de tipos complejos en interfaces remotos
o Pasos a seguir
o Tareas a realizar
Documentacin a entregar
Ejercicio 2: Uso de tipos complejos en interfaces remotos
Se parte de un cdigo de ejemplo que implementa una serie de procedimientos remotos para el
procesamiento de vectores:
escalado de un vector (multiplicacin por una constante)
suma de 2 vectores
Descarga: rpc2.tar.gz
Pasos a seguir
1. Descomprimir el paquete.
2. $ tar xzvf rpc2.tar.gz
3. $ cd rpc2
4. Contenido
o vector.x: Definicin XDR del interfaz remoto.
La sintaxis de XDR es similar a la C, pero no es C.
En este caso se usa el tipo de dato XDR que implementa un ''vector de tamao
variable'' t_vector, que no existe en C.
Al generar el cdigo C ese ''vector variable'' se definir como un estrucutra con
dos campos: t_vector_len con la longitud del vector y t_vector_val con un puntero
al array de nmeros reales en memoria.
typedef struct {
u_int t_vector_len;
float *t_vector_val;
} t_vector;
o servidor_vector.c: Implementacin de los procedimientos remotos definidos.
o cliente_vector.c: Ejemplo de llamadas a los mtodos remotos exportados.
Revisar el fichero vector.x y sus declaraciones de datos.
5. Compilar con rpcgen la definicin del interfaz remoto
6. $ rpcgen vector.x
Genera los siguientes ficheros.
o vector.h: Fichero de cabecera con constantes y las definiciones de las estructuras usadas
como parmetros de entrada y como valores e salida.
Comprobar la definicin de los tipos
o vector_clnt.c: Cdigo C con la implementacin del stub
o vector_svc.c: Cdigo C con la implementacin del skeleton
o vector_xdr.c: Cdigo C con la implementacin de las rutinas XDR para
aplanar/desaplanar los argumentos y el valor de retorno
vector.x
const MAX_VECTOR=100;
typedef float t_vector<>;
struct entrada1 {
t_vector v;
float c;
};
struct entrada2 {
t_vector v1;
t_vector v2;
};
struct entrada3 {
t_vector v3;
t_vector v4;
};
program OPER_VECTOR {
version OPER_VECTORVER {
t_vector escalado_vector(entrada1) = 1;
t_vector suma_vectorial(entrada2) = 2;
t_vector producto_vectorial(entrada3) = 3;
} = 1;
} = 0x30000002;
cliente_vector.c
#include "vector.h"
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
/* prototipos que llamanan al metodo aleatorio y volcar vector */
float * crear_vector_aleatorio(int);
void volcar_vector(t_vector);
// METODO PRINCIPAL
int main(int argc, char ** argv) {
char *host;
if (argc != 2) {
fprintf(stderr, "ERROR: formato incorrecto \nCliente nombre_servidor\n");
exit(1);
}
host = argv[1];
CLIENT *clnt;
t_vector *resultado1;
//t_vector *resultado2;
entrada1 args1; // llamada a entrada1 del archivo vector.x
entrada2 args2; // llamada a entrada2 del archivo vector.x
entrada3 args3; // llamada a entrada3 del archivo vector.x
vector2.t_vector_val = crear_vector_aleatorio(5);
printf("VECTOR 2:");
volcar_vector(vector2);
printf("\n");
/* llamada a escalado_vector */
args1.v = vector1;
args1.c = 100.0;
resultado1 = escalado_vector_1(&args1, clnt);
if (resultado1 == (t_vector *) NULL) {
clnt_perror (clnt, "call failed");
}
printf("ESCALADO DE VECTOR (*100)\n vector resultado:");
volcar_vector(*resultado1);
printf("\n");
/* llamada a suma vectorial */
args2.v1 = vector1;
args2.v2 = vector2;
resultado1 = suma_vectorial_1(&args2, clnt);
if (resultado1 == (t_vector *) NULL) {
clnt_perror (clnt, "call failed");
}
printf("SUMA VECTORIAL DE 2 VECTORES\n vector resultado:");
volcar_vector(*resultado1);
printf("\n");
//////////////////////////////////////////////////////////////////
/* llamada a producto vectorial */
args3.v3 = vector1; // se cambio v1 por v3 para que almacene vector1
args3.v4 = vector2; // se cambio v2 por v4 para que almacene vector2
// se cambio AQUI
y AQUI
resultado1 = producto_vectorial_1(&args3, clnt);
if (resultado1 == (t_vector *) NULL) {
clnt_perror (clnt, "call failed");
}
printf("PRODUCTO VECTORIAL DE 2 VECTORES\n vector resultado:");
volcar_vector(*resultado1);
printf("\n");
////////////////////////////////////////////////////////////////////
clnt_destroy (clnt);
}
servidor_vector.c
/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "vector.h"
#include <malloc.h>
/*
* Implementacin del escalado de vectores
* multiplica cada elemento del vector por la constante indicada
*/
t_vector * escalado_vector_1_svc(entrada1 *argp, struct svc_req *rqstp) {
static t_vector result;
/* Valor de retorno */
static float vector_aux[MAX_VECTOR]; /* Espacio esttico para almacenar el vector resultado*/