Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Concepto de RPC
En unix es posible tener en ejecucin un programa en C con varias funciones
que pueden ser llamadas desde otro programas. Estos otros programas pueden
estar corriendo en otros ordenadores conectados en red.
Supongamos, por ejemplo, que tenemos un ordenador muy potente en clculo
matemtico y otro con un buen display para grficos. Queremos hacer un
programa con mucho clculo y con unos grficos "maravillosos". Ninguno de los
dos ordenadores cumple con ambos requisitos. Una solucin, utilizando RPC
(Llamada a procedimientos remotos), consiste en programar las funciones
matemticas en el ordenador de clculo y publicar dichas funciones. Estas
funciones podrn ser llamadas por el ordenador grfico, pero se ejecutarn en
el ordenador de clculo. Por otro lado, hacemos nuestros grficos en el
ordenador grfico y cuando necesitemos algn clculo, llamamos a las
funciones del ordenador de clculo.
Al programa con las funciones se le llama "servidor". Al programa que llama a
esas funciones se le llama "cliente". Normalmente el servidor est siempre
corriendo y a la espera de que algn cliente llame a alguna de sus funciones..
Cuando el cliente llama a una funcin del servidor, la funcin se ejecuta en el
servidor y el cliente detiene su ejecucin hasta que el servidor termina.
En el cdigo del programa servidor bsicamente hay que seguir los siguientes
pasos:
Codificar las funciones que van a ser llamadas siguiendo un determinado
mecanismo.
Informar al sistema operativo (unix) de un nombre, una versin y funciones que
publica.
Meterse en un bucle infinito esperando que alguien llame a alguna de sus
funciones.
Mientras que el programa cliente debe:
Establecer una conexin con el servidor.
Llamar a las funciones.
EL PROGRAMA RPCGEN
Afortunadamente en unix existe una utilidad llamada rpcgen que nos ayuda en
todo el proceso de codificacin. En un lenguaje similar a C (pero no igual)
definimos los prototipos de las funciones que queremos que se publiquen.
Habitualmente dicho fichero suele tener la extensin ".x". Luego, con el
comando de unix
rpcgen -a fichero.x
se generan varios ficheros (7 en concreto) con todo el cdigo hecho, excepto,
naturalmente, el cdigo de las funciones que queremos publicar.
Si no ponemos la opcin -a, se generarn menos ficheros, dejndonos a
nosotros el trabajo de generar los siguientes. El motivo es que sin la opcin -a
se generan nicamente los ficheros con las funciones (vacias, para que las
rellenemos). Con la opcin -a se generan adems unos ejemplos de uso, que
pueden ser tiles siempre y cuando estemos dispuestos a modificarlos. En el
resto del texto suponemos siempre que se ha usado la opcin -a.
El servidor que genera rpcgen tiene todo prcticamente hecho, con la
excepcin de que nuestras funciones estn casi vacias (devuelven un valor por
defecto). Tenemos que editar y rellenar el cdigo de nuestras funciones.
El cliente que genera rpcgen tiene tambin todo hecho. Se conecta al servidor,
llama a todas las funciones una por una y cierra la conexin. Obviamente
aprovechamos el principio (la conexin) y el final (la desconexin). Las llamadas
a las funciones deberamos borrarlas y hacer que el cliente haga lo que
nosostros queramos.
Veamos un pequeo ejemplo de un fichero.x
program NOMBRE_PROGRAMA {
version VERSION_PROGRAMA {
int incrementa (int) = 1;
} = 1;
} = 0x20000001;
Una vez escrito nuestro fichero suma.x, hacemos una llamada al comando de
unix "rpcgen -a suma.x". Esto generar 7 ficheros distintos (Puedes "pinchar" el
nombre del fichero para verlo. Si lo descargas, qutale la extensin ".txt").
Makefile.suma. Es el fichero Makefile necesario para compilar todos los dems
ficheros de cdigo generados por rpcgen. El comando de unix "make -f
Makefile.suma" nos generar los ejecutables de cliente y servidor.
suma_xdr.c. Como RPC permite llamadas de clientes a servidores que estn en
mquinas distintas y, por tanto, puedan tener una arquitectura distinta, es
necesario traducir los parmetros y resultados a un "cdigo" universal,
independiente de las mquinas. Si los parmetros son tipos bsicos (int, float,
char, etc), el sistema unix ya tiene unas funciones de conversin (xdr_int(),
xdr_float(), etc). Si los parmetros, como en este caso, son estructuras
definidas por nosotros, las funciones de conversin hay que hacerlas. rpcgen
genera automticamente dichas funciones y en nuestro caso, las ha metido en
el fichero suma_xdr.c
suma.h. Aqu estn los prototipos de nuestras funciones. Cualquier cliente que
quiera usarlas, deber hacer un include de este fichero. El prototipo no es
exactamente como esperaramos. A cada funcin le aade en el nombre unas
"coletillas" para indicar el nmero de versin. Define tambin otras constantes
como nombre de programa, nmero de versin, etc, que son tiles a la hora de
hacer la conexin con el servidor.
suma_server.c. En este fichero estn nuestras funciones, vacas, por supuesto.
Debemos editarlo y escribir aqu nuestro cdigo. Veamos el fichero con un poco
de detalle:
int * suma_1_svc(sumandos *argp, struct svc_req *rqstp)
{
static int result;
/*
* insert server code here
*/
result = argp->sumando1 + argp->sumando2; /* Esta lnea debe
hacerla el programador */
return &result;
}