viernes, 19 de abril de 2013

Llamada a procedimientos remotos(RPC) usando rpcgen.

En ocasiones(casi siempre) resulta que los estudiantes recién llegados de docencia, tienen el “miedo escénico” de realizar una aplicación de determinado tipo cuando lo que cuenta no es la evaluación sino que funcione la aplicación propiamente dicho. Uno de los ejemplos más comunes son las aplicaciones que se comunican por la red. Este ejemplo muestra cómo utilizar rpcgen para autogenerar casi por completo un programa cliente y uno servidor.
Sobre rpc se pudiese decir mucho, de manera general es usado para realizar cómputo distribuido, por ejemplo un servidor capaz de resolver complejas ecuaciones matemáticas “caras” en procesamiento; a este se pasarían los datos en una llamada procedimiento remoto, y se tendría como resultado el/los dato/s para cualquiera de los clientes que generalmente tienen procesadores más modestos.
Sobre cliente-servidor mencionar que el servidor “siempre” debe estar listo para atender a los clientes, que este tiene un comportamiento pasivo (o sea, son los clientes quienes comienzan el diálogo).
El uso de rpcgen se basa en editar una archivo extensión “.x” (sintaxis RPC Language casi ANSI C) para la definición del programa, así como de sus funciones principales:
program  nombre {
version nombre_versión {
tipo nombre (parametro) = id;//funCion
} = ID;
} = identificador;
Para esta estructura tomamos a nombre como el nombre que tendrá el programa, identificador, la versión del mismo(un cliente puede especificar que versión del programa servidor usar en caso de contar con varias), en el ámbito nombre_versión van las  funciones proveídas, funCion sería una o varias funciones que serían reconocidas mediante id, reciben un solo parámetro, en caso  que se necesite más de uno se pasan mediante una estructura. Aquí tomemos un ejemplo para realizar multiplicaciones en el servidor bajo la demanda de los clientes, guardamos el siguiente código en un archivo MULT.x:
struct factores
{
int factor_a;
int factor_b;
};
program multiplicador {
version v_multiplicador {
int multiply (factores) = 01;
} = 01;
} = 0×01;
Una vez que ejecutemos rpcgen -a MULT.x para dejar el programa funcional se necesitan realizar algunos cambios menores, ya que con la opción -a le hemos dicho a rpcgen que genere todos los archivos, incluido el código de ejemplo para un cliente y un servidor. Editamos el archivo MULT_server.c y donde dice:
/*
* insert server code here :-D
*/
ponemos el códgo que queremos sea ejecutado en la llamada a este procedimiento, para este caso:
printf (“Received %d and %d\n”, argp->factor_a, argp->factor_b);
result = argp->factor_a * argp->factor_b;
printf (“Sent %d\n”, result);
En el cliente modificamos el código en aras de mostrar por la salida estándar el resultado de la operación. Vamos al archivo MULT_client.c y en la función void
multiplicador_01(char *host) hacemos los siguientes cambios:
//remplazas factores  multiply_01_arg;
por:
factores  multiply_01_arg = {100, 25};
printf (“Sent %d and %d\n”, multiply_01_arg.factor_a,
multiply_01_arg.factor_b);
if (result_1 == (int *) NULL) {
clnt_perror (clnt, “call failed”);
}//se remplaza por
if (result_1 == (int *) NULL) {
clnt_perror (clnt, “call failed”);
}else {
printf (“Received %d\n”, *result_1);
}
Luego compilamos con make -f Makefile.MULT, el servidor lo corremos como root, y al cliente le pasamos por parámetro la dirección IP donde se encuentra el servidor. Cabe señalar que para leerse el código del programa que aquí se muestra tan “trivial” requiere un poco de estudio extra, pero bueno ;-) ya sabes por dónde comenzar…
NOTA:
Con la opción -f nombre le decimos a make que lo estamos forzando a seguir las reglas de compilación en un archivo no llamado Makefile.

No hay comentarios:

Publicar un comentario

Deje su comentario..., 0 palabras obscenas...