Documentos de Académico
Documentos de Profesional
Documentos de Cultura
peticin
respuesta
El Llamado de procedimientos
remotos
Diapo. No. 1
cliente
cliente
cliente
cliente
(ack)
(34759037F3247A)
(ack)
servidor
servidor
servidor
servidor
Diapo. No. 2
Diapo. No. 3
Variables locales
al main
main()
{
main()
{
:
count = read(fd, bytes, buf)
:
}
:
count = read(fd, bytes, buf)
:
}
SP
Variables locales
al main
bytes
buf
fd
direccin regreso
Variables locales
al main
SP
SP
Diapo. No. 4
Por referencia
en el stack se almacena la direccin de la variable
es posible modificar el valor del parmetro
call-by-copy/restore
se copia el valor de la variable en el stack, (como en paso por valor)
al final de la ejecucin local se copia el valor que tiene la variable dentro
del procedimiento, en el stack
el procedimiento que mand llamar al procedimiento copia el valor final
en condiciones normales tiene el mismo efecto que el paso por referencia
Dr. Luis Enrique Colmenares
Diapo. No. 5
El RPC
Creado por Birrel & Nelson en 1984
Permiten a los programas llamar procedimientos localizados en
otras mquinas
Un proceso x en una mquina A, puede llamar un procedimiento
localizado en una mquina B
Informacin puede llevarse del proceso invocador al invocado
dentro de los parmetros
Ningn mensaje u operacin de E/S es visible para el programador
Problemas a resolver:
procedimientos invocador e invocado se ejecutan en diferentes mquinas, i.e.
diferentes direcciones y posiblemente diferentes arquitecturas
ambas mquinas pueden fallar
Dr. Luis Enrique Colmenares
Diapo. No. 6
Mquina Servidor
stub del
cliente
call
cliente
return
Pack
parmetros
stub del
servidor
Unpack
parmetros
Unpack
resultado
kernel
call
servidor
Pack
resultado
return
kernel
Diapo. No. 7
Diapo. No. 8
El
El paso
pasode
deparmetros
parmetros
stubs
Mquina Cliente
Mquina Servidor
mensaje
:
sum
:
4
n=sum(4,7);
:
7
:
mensaje sum(i,j)
kernel
kernel
sum
4
7
int i,j;
{
return(i+j);
}
Diapo. No. 9
Problemas a resolver
diferencias entre representacin de datos
diferencias en formatos
paso de apuntadores, (estructuras complejas)
Optimizacin
especificacin parmetros de entrada y salida
registros para paso de apuntadores
Diapo. No. 10
#include <header.h>
specification of file_server, version 3.1
long read(in char name[MAX_PATH], out char buf[BUF_SIZE],
in long bytes, in long position);
long write(in char name[MAX_PATH], in char buf[BUF_SIZE],
in long bytes, in long position);
int create(in char[MAX_PATH], in int mode);
int delete(in char[MAX_PATH]);
end.
Diapo. No. 11
Accin
Parmetros Entrada
Registrar
Suprimir
Buscar
Nombre, versin
Salida
Manejador, id nico
Diapo. No. 12
Registro
Registrodel
delservidor
servidor
SERVIDOR
Nombre
Num. versin
Id.nico
Manejador,
(handler)
Otros
(autentificacin)
Binder
Sistema Distribuido
Diapo. No. 13
Peticin
Peticincliente
cliente
error
3
servicio NO
disponible
Binder
proceso 1
solicitante
2
stub
cliente
servicio
disponible
Diapo. No. 14
Servidor
Puerto
1061
Maquina Servidor
Puerto
111
Portmapper
Paso 2: Donde
esta PRIMEPROG
Version 1?
Paso 4: Llama
procedimiento 1.
Aqu estn los
datos
Paso 3: Esta en
el puerto 1061
Cliente
Diapo. No. 15
El comando rpcinfo
Realiza una llamada RPC a un servidor RPC y reporta lo que encuentra.
Dependiendo de los parmetros es posible:
- listar todos los servicios de un RPC en un host
- listar todos los servicios RPC registrados con rpcbind versin 2
- realizar una llamada RPC al procedimiento 0 de un determinado programa
y de una determinada versin en un host dado.
Dr. Luis Enrique Colmenares
Diapo. No. 16
Diapo. No. 17
Ejemplo rpcinfo
rmagnac:45>rpcinfo -s toto
ogram version(s)
netid(s)
service owner
00000
2,3,4
udp, tcp, tictls, ticosord, ticots
rpcbin
superuser
00029
2,1
ticots, ticotsord, ticlts
keyserv superuser
00078
4
ticots, ticotsord, ticlts
kerbd
superuser
00087
10
udp
admind superuser
00011 1
ticlts, udp
rquotad superuser
00002
3,2
ticlts, udp
rusersd superuser
00099
1
ticots, ticotsord, ticlts
superuser
00012
1
ticlts, udp
sprayd
superuser
00008
1
ticlts, udp
walld
superuser
00001
4,3,2
ticlts, udp
rstad
superuser
00024
1
ticots, ticotsord, ticlts, tcp, udp
status
superuser
00021
2,3,1
ticots, ticotsord, ticlts, tcp, udp
nlockmgr superuser
34177279 1,2
tcp
5001
rmagnac:46>
Diapo. No. 18
Programa Servidor
procedimientos servicio
Portmapper
funcin dispatch
callrpc ()
host, programa, versin,
procedimiento, argumentos
errores o resultados
Programa Cliente
Mquina Cliente
Diapo. No. 19
Aplicacin
Usuario
4. TRANSPORTE
TCP
UDP
3. RED
IP
1-2.ENLACE / FSICO
NIVELES
OSI
Interface
Hardware
RED
Dr. Luis Enrique Colmenares
Diapo. No. 20
Diapo. No. 21
Stub
Cliente
Kernel
Mquina
Mquina Servidor
Realizar sevicio Servidor
Llamar al servidor
Poner los parametros en el stack
Unmarshall parametros
Servidor
Server
Stub
Kernel
Mquina
Diapo. No. 22
EL RPC DE SUN
Diapo. No. 23
user developed
Compilador RPC
filtros comunes
y archivo
encabezado
compilar
y
ligar
compilar
y
ligar
funciones
cliente
cdigo cliente
Dr. Luis Enrique Colmenares
Bibliotecas de RPC y
de representacin
de datos
funciones
servidor
cdigo servidor
Diapo. No. 24
Equivalente en C
-Comentarios
Igual que en lenguaje C
-Constantes simblicas
const MAX_SIZE = 8192
- Enumeraciones
enum colores{ROJO = 0, VERDE=1, enum colores { ROJO=0, VERDE=1,
AZUL=2};
AZUL=2};
typedef enum colores colores;
-Booleanos
bool termino;
bool_t termino;
-Arreglos tamao fijo
int alumnos[10];
int alumnos[10];
Diapo. No. 25
RPCL
Equivalente en C
struct punto {
int x;
int y;
};
typedef struct punto punto;
Diapo. No. 26
-Strings
No existen en C, RPCL convencin de terminacin en NULL
Tamao especifica mximo nmero caracteres permitidos en string
No especificado => tamao mximo = mximo valor u_int;
string nombre <32>
string nombresote<>
char *nombre;
char *nombresote;
-Uniones
Ms cercanas al registro variante de Pascal
union resultado switch (int errno){
struct resultado {
case 0:
int errno;
opaque data[1024];
union {
case 1:
char data[1024]
int
valor;
int valor;
default:
} resultado_u;
void
};
};
typedef struct resultado resultado;
Diapo. No. 27
RPCL
-Datos opacos
Usados para describir datos que no tienen tipo
Dato puede ser de tamao fijo o variable
Equivalente en C
opaque diskblock[512];
char diskblock[512];
opaque filedata<1024>
struct {
u_int filedata_len;
char *filedata_val;
} filedata
-Typedef RPCL
Misma sintaxis que en C
Ejemplo define un fname_type usado para declarar strings de nombres de
archivos que tienen una longitud mxima de 255 caracteres
typedef string fname_type <255>
- Identificadores
Compuestos de letras, nmeros y el underscore
Distincin entre mayusculas y minusculas
Diapo. No. 28
Pasos
Pasospara
paraconvertir
convertirllamadas
llamadaslocales
localesen
enremotas
remotas
Diapo. No. 29
perimetro (a)
area(a)
:
per = perimetro(20)
:
sup = area(20
:
int
double
:
4*a
:
a*a
:
Diapo. No. 30
Paso I
Diseo del
servicio local
Diapo. No. 31
Calculo
Calculopermetro
permetroyyrea
reade
deun
uncuadrado
cuadrado
#include <stdio.h>
int perimetro(int a)
{
return 4*a;
}
double area (int a)
{
return a*a;
}
Diapo. No. 32
Cdigo
Cdigodel
delservidor
servidorlocal:
local:servidor.c
servidor.c
#include cuad.h
int perimetro(int a)
{
int res;
res = 4*a;
return(res);
}
double area(int a)
{
double res;
res = a*a;
return(res);
}
Diapo. No. 33
Cdigo
Cdigodel
delcliente
clientelocal:
local:cliente.c
cliente.c
#include <stdio.h>
#include <stdlib.h>
#include cuad.h
main(int argc, char *argv[])
{
int a;
int per;
double sup;
if (argc !=2 ) {
fprintf(stderr,"Error, uso: %s a \n",argv[0]);
exit(1);
}
a = atoi(argv[1]);
per = perimetro(a);
sup = area(a);
printf("El perimetro del cuadrado es %d \n",per);
printf("El area del cuadrado es %g \n",sup);
Dr. Luis Enrique Colmenares
Diapo. No. 34
El
Elarchivo
archivode
deencabezado
encabezadocuad.h
cuad.h
int perimetro(int);
double area(int);
Diapo. No. 35
Compilando y ejecutando
Diapo. No. 36
Paso II
Diseo del archivo
de configuracin y
uso de rpcgen
Diapo. No. 37
El
Elarchivo
archivode
deespecificacin
especificacincuadro.x
cuadro.x
/*Nombre archivo:
cuadro.x */
/*Nombre archivo:
cuadro.x */
program CUADRO_PROG {
version CUADRO_VERS{
int PERIMETRO(int)
= 1;
double AREA(int) =
2;
} = 1;
} = 0x311445566;
program CUADRO_PROG {
version CUADRO_VERS{
int PERIMETRO(int)
= 1;
double AREA(int) =
2;
} = 1;
} = 2;
Diapo. No. 38
Nmeros
Nmeros de
de programas
programas remotos
remotos
Rango (hexadecimal)
Administrador
Tiempo de vida
Distribucin
00000000 - 1FFFFFFF
20000000 - 3FFFFFFF
40000000 - 5FFFFFFF
50000000 - 7FFFFFFF
80000000 - 9FFFFFFF
A0000000 - BFFFFFFF
C0000000 - DFFFFFFF
E0000000 - FFFFFFFF
Sun
Local
Desarrollador
Reservado
Reservado
Reservado
Reservado
Reservado
Permanente
Desconocido
Temporal
Pblica
Local
Local
Diapo. No. 39
Sintxis
Sintxisdel
delrpcgen
rpcgen
rpcgen infile
rpcgen [ -a ] [ -A ] [ -b ] [ -C ] [-D name [ = value] ]
[ -i size ] [ -I [ -K seconds ] ] [ -L ]
[ -M ] [ -N ] [ -T ] [ -Y pathname ] infile
rpcgen [ -c | -h | -m | -t | -Sc | - Ss | -Sm ]
[ -o outfile ] [ infile ]
rpcgen [ -s nettype ] [ -o outfile ] [ infile]
rpcgen [ -n netid ] [ -o outfile ] [ infile ]
Diapo. No. 40
Opciones rpcgen
-Dnombre[=valor]
-I
-K segundos
-L
-T
-s transporte
-o archivo-salida
-c
-h
-l
-m
-t
-a
-b
-C
-i tamao
-N
-Sc
-Ss
-Y path
Dr. Luis Enrique Colmenares
Archivos
Archivosgenerados
generadospor
porrpcgen
rpcgen
Comando a ejecutar:
$ rpcgen -C -a cuadro.x
Archivos generados:
Makefile.cuadro
makefile para compilar el cdigo del cliente y del servidor.
cuadro_clnt.c
contiene el stub del cliente, el cual usualmente no es modificado.
cuadro_svc.c
contiene stub servidor
cuadro.h
contiene todos los tipos XDR generados a partir de la especificacin.
Diapo. No. 42
Archivos
Archivosgenerados
generadospor
porrpcgen
rpcgen
cuadro_client.c
programa esqueleto del cliente con llamadas dummy al servicio remoto.
Inserta cdigo para asignar los valores de los argumentos para el servicio
remoto.
cuadro_server.c
contiene stubs para servicios remotos. Inserta cdigo para la versin local
dentro de los stubs.
cuadro_xdr.c
contiene filtros XDR necesarios para los stubs del cliente y servidor.
Diapo. No. 43
Archivos
Archivosgenerados
generadospor
porrpcgen
rpcgendel
delarchivo
archivocuadro.x
cuadro.x
cuadro_server.c
cuadro_svc.c
archivos servidor
cuadro_xdr.c
cuadro.x
rpcgen
cuadro.h
archivos comunes
Makefile.cuadro
cuadro_clnt.c
archivos cliente
cuadro_client.c
Diapo. No. 44
Paso III
Insertar cdigo en
archivos generados
por rpcgen
Diapo. No. 45
Programa
Programacuadro_client.c
cuadro_client.cgenerado
generadopor
porrpcgen
rpcgen
/*
* 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 "cuadro.h"
void
cuadro_prog_1(char *host)
{
CLIENT *clnt;
int *result_1;
int perimetro_1_arg;
double *result_2;
int area_1_arg;
Dr. Luis Enrique Colmenares
Diapo. No. 46
#ifndef DEBUG
clnt = clnt_create (host, CUADRO_PROG, CUADRO_VERS, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
#endif /* DEBUG */
result_1 = perimetro_1(&perimetro_1_arg, clnt);
if (result_1 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
result_2 = area_1(&area_1_arg, clnt);
if (result_2 == (double *) NULL) {
clnt_perror (clnt, "call failed");
}
#ifndef
DEBUG
clnt_destroy (clnt);
#endif /* DEBUG */
}
Diapo. No. 47
int
main (int argc, char *argv[])
{
char *host;
if (argc < 2) {
printf ("usage: %s server_host\n", argv[0]);
exit (1);
}
host = argv[1];
cuadro_prog_1 (host);
exit (0);
}
Diapo. No. 48
Versin
Versinfinal
finaldel
delprograma
programa cuadro_client.c
cuadro_client.c
#include "cuadro.h"
int main (int argc, char *argv[])
{
CLIENT *clnt;
char *host;
int a;
int *per;
double *sup;
if (argc !=3 ) {
fprintf(stderr,"Error, uso: %s a host \n",argv[0]);
exit(1);
}
a = atoi(argv[1]);
host = argv[2];
Dr. Luis Enrique Colmenares
Diapo. No. 49
Diapo. No. 50
Archivo
Archivoesqueleto
esqueletode
decuadro_server.c
cuadro_server.c generado
generadopor
porrpcgen
rpcgen
#include "cuadro.h"
int * perimetro_1_svc(int *argp, struct svc_req *rqstp)
{
static int result;
/*
* insert server code here
*/
return &result;
}
double * area_1_svc(int *argp, struct svc_req *rqstp)
{
static double result;
/*
* insert server code here
*/
return &result;
}
Dr. Luis Enrique Colmenares
Diapo. No. 51
Versin
Versinfinal
finaldel
delprograma
programaservidor
servidor
#include "cuadro.h"
int * perimetro_1_svc(int *argp, struct svc_req *rqstp)
{
static int result;
result = 4* (*argp);
return &result;
}
double * area_1_svc(int *argp, struct svc_req *rqstp)
{
static double result;
result = (*argp) * (*argp);
return &result;
}
Diapo. No. 52
Paso IV
Compilando y
ejecutando los
programas
Diapo. No. 53
Diapo. No. 54
Diapo. No. 55
Ejemplos
de
cdigos
de stub
Diapo. No. 56
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include <memory.h> /* for memset */
#include "cuadro.h"
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };
Diapo. No. 57
int *
perimetro_1(int *argp, CLIENT *clnt)
{
static int clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, PERIMETRO,
(xdrproc_t) xdr_int, (caddr_t) argp,
(xdrproc_t) xdr_int, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
Diapo. No. 58
double *
area_1(int *argp, CLIENT *clnt)
{
static double clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, AREA,
(xdrproc_t) xdr_int, (caddr_t) argp,
(xdrproc_t) xdr_double, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
Diapo. No. 59
Diapo. No. 60
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void,
(char *)NULL);
return;
case PERIMETRO:
_xdr_argument = (xdrproc_t) xdr_int;
_xdr_result = (xdrproc_t) xdr_int;
local = (char *(*)(char *, struct svc_req *))
perimetro_1_svc;
break;
case AREA:
_xdr_argument = (xdrproc_t) xdr_int;
_xdr_result = (xdrproc_t) xdr_double;
local = (char *(*)(char *, struct svc_req *))
area_1_svc;
break;
Dr. Luis Enrique Colmenares
Diapo. No. 61
Diapo. No. 62
Diapo. No. 63
Diapo. No. 64
Llamadas con ms de un
parmetro
problemas y soluciones
Diapo. No. 65
a,b,c
:
res1 = raiz(a,b,c)
:
res2 = complejo(a,b,c)
:
r1, r2
real, imag
b b 24 ac
res=
2a
b ( b 24 ac )
complex =
j
2a
2a
Diapo. No. 66
Diapo. No. 67
Servidor Local
#include "encabeza.h"
struct raiz resuelve(a,b,c)
float a,b,c;
{
int temp;
struct raiz res;
res.error=0;
temp = (b*b) - (4*a*c);
if (temp < 0)
res.error=1;
else {
res.r1 = (-b + sqrt((double)temp)) / (2*a);
res.r2 = (-b - sqrt((double)temp)) / (2*a);
}
return res;
}
Dr. Luis Enrique Colmenares
Diapo. No. 68
Cliente Local
#include "encabeza.h"
#include stdio.h
#include stdlib.h
main(argc, argv)
int argc;
char *argv[];
struct complex rescom;
struct raiz result;
float a,b,c;
if (argc != 4) {
fprintf(stderr,"Error, uso: %s a b c\n",
argv[0]);
exit(1);
}
a=(float)atoi(argv[1]);
b=(float)atoi(argv[2]);
c=(float)atoi(argv[3]);
result=resuelve(a,b,c);
if ( ! result.error ) {
printf("La solucion de (%.1f %.1f %.1f)\n",a,b,c);
printf("es %.5f y %.5f\n",result.r1, result.r2);
}
else {
rescom=complejo(a,b,c);
printf("La solucion de (%.1f %.1f %.1f)\n",a,b,c);
printf("es (%.5f %.5fj) y (%.5f %.5fj)\n",
rescom.real, rescom.imag,
rescom.real, (-1)*rescom.imag);
}
}
Diapo. No. 69
Diapo. No. 70
Compilando y ejecutando
Diapo. No. 71
Diapo. No. 72
program RAIZ_PROG {
version RAIZ_VERS{
struct raiz RESUELVE(datos) = 1;
struct complex COMPLEJO(datos) = 2;
} = 1;
} = 0x31112345;
Esta parte o esta otra
program RAIZ_PROG {
version RAIZ_VERS{
struct raiz RESUELVE(datos) = 1;
struct complex COMPLEJO(datos) = 2;
} = 1;
} = 2;
Diapo. No. 73
struct complex *
complejo_1_svc(datos *argp,
struct svc_req *rqstp)
{
static struct complex result;
/*
* insert server code here
*/
return (&result);
}
return (&result);
}
Dr. Luis Enrique Colmenares
Diapo. No. 74
Servidor remoto
#include "raiz.h"
struct raiz *
resuelve_1_svc(datos *argp, struct svc_req *rqstp)
{
static struct raiz res;
int temp;
struct complex *
complejo_1_svc(datos *argp, struct svc_req *rqstp)
{
static struct complex res;
float temp;
Diapo. No. 75
Diapo. No. 76
#ifndef
#endif
}
Diapo. No. 77
Cliente remoto
#include "raiz.h"
CLIENT *clnt;
struct raiz *raices;
datos data;
struct complex *rescom;
main(argc, argv)
int argc;
char *argv[];
{
char *host;
if (argc !=5) {
printf("uso: %s host a b c \n", argv[0]);
exit(1);
}
host = argv[1];
data.a =(float)atoi(argv[2]);
data.b =(float)atoi(argv[3]);
data.c =(float)atoi(argv[4]);
clnt = clnt_create(host, RAIZ_PROG, RAIZ_VERS, "netpath");
if (clnt == (CLIENT *) NULL) {
clnt_pcreateerror(host);
exit(1);
}
raices = resuelve_1(&data, clnt);
if (raices == (struct raiz *) NULL) {
clnt_perror(clnt, "call failed");
}
Diapo. No. 78
if ( ! raices->error ) {
printf("La solucion de (%.1f %.1f %.1f)\n",data.a,data.b,data.c);
printf("es %.5f y %.5f\n",raices->r1, raices->r2);
}
else {
rescom = complejo_1(&data, clnt);
if (rescom == (struct complex *) NULL) {
clnt_perror(clnt, "call failed");
}
printf("La solucion de (%.1f %.1f %.1f)\n",data.a,data.b,data.c);
printf("es (%.5f %.5fj) y (%.5f %.5fj)\n",rescom->real, rescom->imag,
rescom->real, (-1)*(rescom->imag));
}
clnt_destroy(clnt);
}
Diapo. No. 79
Diapo. No. 80
by rpcgen
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = raiz.x
TARGETS_SVC.c = raiz_svc.c raiz_server.c raiz_xdr.c
TARGETS_CLNT.c = raiz_clnt.c raiz_client.c raiz_xdr.c
TARGETS = raiz.h raiz_xdr.c raiz_clnt.c raiz_svc.c raiz_client.c raiz_server.c
OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags
CFLAGS += -g
LDLIBS += -lnsl -lm
RPCGENFLAGS =
Dr. Luis Enrique Colmenares
Diapo. No. 81
Diapo. No. 82
Diapo. No. 83
callrpc()
clnt_destroy()
clnt_call()
clnt_control()
clnt_freeres()
R
E
D
registerrpc()
svc_run()
Librera de Transporte
clnt_create()
clntudp_create()
clntcp_create()
clntraw_create()
Librera de Transporte
llamadas
de
bajo nivel
svc_udp_create()
svc_tcp_create()
svcraw_create()
svc_destroy()
llamadas
de
bajo nivel
svc_register()
svc_unregister()
svc_getargs()
svc_sendreply()
Diapo. No. 84
Diseo de filtros
para envo y
recepcin de datos
en RPC
Diapo. No. 85
formato XDR
little endian
big endian
Diapo. No. 86
Descripcin
xdrmem_create()
xdrrec_create()
xdrstdio_create()
xdr_destroy()
xdr_getpos()
xdr_inline()
xdrrec_endofrcord()
xdrrec_eof()
xdrrec_readbytes()
xdrrec_skiprecord()
xdr_setpos()
Diapo. No. 87
Filtro
xdr_char()
xdr_short()
xdr_u_short()
xdr_int()
xdr_u_int()
xdr_long()
xdr_u_long()
xdr_float()
xdr_double()
xdr_void()
xdr_enum()
Tipo XDR
int
int
unsigned int
int
unsigned int
int
unsigned int
float
double
void
int
Diapo. No. 88
Filtro
xdr_array()
xdr_bytes()
xdr_opaque()
xdr_pointer()
xdr_reference()
xdr_string()
xdr_union()
xdr_vector()
xdr_wrapstring()
Diapo. No. 89
struct netuser {
char *nu_hostname;
int nu_uid;
u_int
nu_glen;
int *nu_gids;
};
#define NLEN 255
/* host names < 256 caracteres */
#define NGRPS 20
/* usuario no puede estar en mas de 20 grupos */
bool_t xdr_netuser(xdr_handelp, nup)
XDR
*xdr_handlep;
struct netuser *nup;
{
if ( xdr_int(xdr_handlep, &nup-> nu_uid) == FALSE )
return(FALSE);
if ( xdr_string(xdr_handlep, &nup-> nu_hostname, NLEN) == FALSE )
return(FALSE)
if (xdr_u_int(xdr_handlep, &nup-> nu_glen) == FALSE )
return(FALSE)
return(xdr_array(xdr_handlep, &nup->nu_gids, &nup->nu_glen, NGRPS, sizeof(int),
xdr_int));
}
Dr. Luis Enrique Colmenares
Diapo. No. 90
Funciones
de
Alto Nivel
Diapo. No. 91
La llamada callrpc()
Funcin que llama un procedimiento dado de alta en un host, a partir de su nmero
de programa, versin y procedimiento.
Sintaxis:
int callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
char * host;
nombre mquina que ofrece el servicio
u_long prognum; nmero de programa
u_long versnum; nmero de versin
u_long procnum; nmero de procedimienrto
xdrproc_t inproc;
direccin filtro XDR que codifica los argumentos
char *in;
argumentos de entrada
xdrproc_t outproc; direccin filtro XDR que decofica valores regreso
char *out;
direccin de los valores de regreso
Diapo. No. 92
Valor de regreso:
- de tipo entero;
- puede castearse a un tipo clnt_stat definido en <rpc/rpc.h> y pasarlo
a clnt_sperrno() para obtener un mensaje de error
- clnt_stat es un tipo enumeracin de C, que contiene los posibles
valores de regreso del RPC
Intenta llamar cinco veces, (cada cinco segundos), si no recibe nada en 25 segs,
regresa un valor clnt_stat de RPC_TIMEOUT
Ejemplo uso:
enum clnt_stat algo;
:
algo = callrpc(host, TOTOPROG, TOTOVERS, TOTO,xdr_toto, toto_in, xdr_toto,
toto_out);
if (algo != 0)
clnt_perror(algo);
:
Dr. Luis Enrique Colmenares
Diapo. No. 93
La llamada registerrpc()
Funcin para registrar un procedimiento, (procname), en el servicio de registro del
servicio de red, (i.e. portmapper)
Sintaxis:
int register(prognum, versnum, procnum, procname, inproc, outproc)
u_long prognum;
nmero del programa
u_long versnum; nmero de versin
u_long procnum;
nmero de procedimiento
char *(*procname)(); procedimiento que otorga el servicio
xdrproc_t inproc;
direccin filtro decodica argumentos entrada
xdrproc_t outproc;
direccin filtro codifica argumentos salida
Valor regreso:
0: si todo sali bien
-1: en caso de error
Dr. Luis Enrique Colmenares
Diapo. No. 94
Ejemplo:
:
if (registerrpc (TOTOPROG, TOTOVERS, TOTO, toto, xdr_toto,
xdr_toto) == -1) {
< rutina de error >
La funcin toto() atender las peticiones que se haga a la combinacin
TOTOPROG, TOTOVERS y TOTO
Diapo. No. 95
La llamada svc_run
Rutina que provoca que el proceso se ponga a escuchar peticiones
Rutina nunca regresa control a la funcin que la invoca a menos que un error
fatal se detecte
No toma argumentos y no regresa ningn resultado
Rutina llamada una vez que se registr exitosamente el procedimiento
Representa el despachador/expedidor de la librera de RPCs
Espera a que reciba una peticin, para enviarla despus al procedimiento
adecuado
Sintaxis:
svc_run();
Ejemplo uso:
:
registerrpc(PROGNUM, VERSNUM, PROC, toto, xdr_toto, xdr_toto);
svc_run();
fprintf(stderr, Error en la llamada de svc_run \n);
}
Dr. Luis Enrique Colmenares
Diapo. No. 96
Diapo. No. 97
Diapo. No. 98
int perimetro(int a)
{
return 4*a;
}
double area (int a)
{
return a*a;
}
Diapo. No. 99
/* nmero de programa */
#define CUADROPROG ((u_long) 0x3111445566)
/* nmero de versin */
#define CUADROVERS
((u_long) 1)
/* procedimiento 1 */
#define PERIMETRO
((u_long) 1)
/* procedimiento 2 */
#define AREAS
((u_long) 2)
Diapo. No.
Diapo. No.
Diapo. No.
Diapo. No.
Diapo. No.
Compilando y ejecutando
En el servidor (armagnac):
rogomez@armagnac:129>gcc servidor.c server_clnt.c -o server
rogomez@armagnac:130>./server
Dado de alta el servicio
En espera de peticiones
En el cliente (tequila):
rogomez@tequila:85>gcc cliente.c client_clnt.c -o client
rogomez@tequila:86>./client 5 armagnac
El perimetro del cuadrado es 20
El area del cuadrado es 25.000000
rogomez@tequila:87>./client 10 armagnac
El perimetro del cuadrado es 40
El area del cuadrado es 100.000000
rogomez@tequila:88>
Dr. Luis Enrique Colmenares
Diapo. No.
Diapo. No.
Diapo. No.
Diapo. No.
Diapo. No.
Diapo. No.
Pet
Recibir
Ejecutar
Contestar
Resp
No
Resp
Recibir
Ejecutar
Crash
(b) Crash despus ejecucin
Pet
Recibir
Crash
No
Resp
Dr. Luis Enrique Colmenares
Ninguna garanta
servidor no reporta nada
Diapo. No.
Diapo. No.
Tratamiento de hurfanos
En el cliente:
Cuando el cliente revive este limpia todos sus clculos
previos de hurfanos.
Esto requiere de tener conocimiento de las pasadas
actividades de RPC no terminadas y la habilidad de
localizarlas (checkpoints, logs, etc.)
El servidor:
Ocasionalmente intenta localizar los propietarios de sus
operaciones remotas y aborta aquellas de las que no
puede encontrar su dueo
Diapo. No.
Principales tcnicas
Exterminacin
Reencarnacin
Reencarnacin gentil
Expiracin
Adopcin
Diapo. No.
Exterminacin
Antes que stub-cliente enve un RPC realiza una
copia:
la copia se hace en disco
se le conoce como logging message
incluye de que se trata todo el mensaje
Diapo. No.
Reencarnacin
No es necesario escribir en disco
Dividir tiempo en pocas secuencialmente
numeradas
Cuando cliente re-vive hace un broadcast a todas las
mquinas declarando el comienzo de una nueva
poca
Cuando el broadcast llega, todas las comunicaciones
remotas son eliminadas
Algunos hurfanos pueden sobrevivir si el nmero
de poca no coincide
Dr. Luis Enrique Colmenares
Diapo. No.
Reencarnacin Gentil
Cuando un broadcast de poca llega, cada
mquina verifica si no hay comunicaciones
remotas, si es as intenta localizar a su dueo
Solo si el dueo no puede localizarse el clculo es
abortado
Diapo. No.
Expiracin
A cada RPC se le asocia un tiempo T para realizar
un trabajo
La operacin es abortada cuando se alcanza dicho
tiempo T
Por otro lado, si despus de una cada el servidor
espera un tiempo T antes de que el cliente reviva,
todos los hurfanos ya se habrn ido.
Es posible que el cliente solicite tiempo adicional
Problema: elegir un buen valor de T
Diapo. No.
Adopcin
Tcnica basada en redundancia
Se cuenta con un proceso, vigilante, que vigila lo
que otro esta realizando
el proceso vigilante pregunta al proceso activo
el proceso activo informa al proceso vigilante
Diapo. No.
Caracterstica: atomicidad
toda la peticin se satisface, o no se hace nada
Dr. Luis Enrique Colmenares
Diapo. No.