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;
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;
};
{
int factor_a;
int factor_b;
};
program multiplicador {
version v_multiplicador {
int multiply (factores) = 01;
} = 01;
} = 0×01;
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
*/
* insert server code here
*/
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);
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:
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);
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);
}
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...