3-1.- Linux RPC

26
3-1.- Linux RPC

Transcript of 3-1.- Linux RPC

3-1.- Linux RPC

RPC    ONC  (Open  Network  Compu2ng)  

n  Ru2nas  para  la  conversión  de  datos  XDR  

n  XDR  maneja  estructuras  complejas    n Herramienta  de  generación  de  programas    

2

Proceso  de  programación  RPC    

n  Programación  de  métodos  locales  y  remotos.      

3

Proc A"

Client Stub"

Server Stub"

Proc B"

RPC

RPC  Dispatching  

4

Proc A1"

Client Stub"

Server Stub"

Proc B1"

Proc A2"

Client Stub"Proc B2"

Server Stub"

Dispatcher"

RPC

RPC

RPC  Interface  Specifica2on  

5

Proc A"

Client comm"

Server Iface"

Proc B"

Server Comm"

Client Iface"

RPC

Entrada  y  salida  rpcgen  n  Entrada  

n  Q.x      Archivo  de  especificación  

n  Salida    n  Q.h    Archivo  headers    n  Q_xdr.c  Procedimientos  XDR  para  hacer  marshaling    n  Q_clnt.c  stub  de  comunicación  del  lado  del  cliente  n  Q_svc.c  stub  de  comunicación  del  lado  del  servidor  

6

Entrada  y  salida  rpcgen  n  Salida    

n  Q_client.c  Plan2lla  para  invocar  los    procedimientos  remotos  n  Q_serve.c  Plan2lla  para  implemetar  los    procedimientos  

remotos  

7

Flujo  del  proceso  RPC  

8

Q.x" rpcgen"

Q_clnt.c"

Q.h"

Q_xdr.c"

Q_svc.c"

Client"application"

Client"interface"

Server"interface"

Remote"procedures"

Q_server"

Q_client"compile"

compile"

Proceso  de  desarrollo  RPC  

9

Develop Interface"

Develop Client" Develop Server"

Desarrollo  de  la  Interface  

10

MyApp.x"

RPCgen"

MyApp_clnt.c"Client Stub"

MyApp_svc.c"Server Stub"

MyApp.h"

MyApp_xdr.c"

Developing  the  Server  

11

MyApp.x"

RPCgen"

MyApp_svc.c"Server Stub"

MyApp.h"MySrvr.c" MyApp_xdr.c"

C Compiler"

Linker"

MyApp_server"

Developing  the  Client  

12

MyApp.idl"

RPCgen"

MyApp_clnt.c"Client Stub"

MyApp.h"MyClnt.c"

C Compiler"

Linker"

MyApp_client"

MyApp_xdr.c"

Proceso de conexión •  Portmap debe estar corriendo (pruebe rpcinfo)

•  Crea un servicio UDP / TCP

•  Portmap regista el servcio UDP/TCP

•  Ejecuta el servicio...

13

Registar  el  servicio  svc_register(port#, SERV#, VER#, serv_func, proto#);

port#:Puerto en el que el servicio está activo

SERV#: identificador único para el servicio

VER#: versión del servicio

serv_func: función a ejecutar del servicio

proto#: IPPROTO_UDP o IPPROTO_TCP

14

Como se conecta el cliente

n  Hacer  una  llamada  a  un  procedimiento  remoto    

n  Encontrar  el  host  remoto  

n  Determinar  el  puerto  del  servicio  (usando  Portmap)  

n  Crear  una  conexión  al  proceso  en  el  servidor  

15

clnt_create(server, SERV#, VER#, proto#);

remote procedure call...

Clnt_destroy(CLIENT);

16

Como se conecta el cliente

Ejemplo  n  Sumar  dos  números    

n  Pasar  dos  párametros  enterso  n  UDP  /  IP  port  connec2on  

n  Archivos  fuentes:  n  suma.x  n  suma_client.c  //  a  Modificar  n  suma_server.c  //  aModificar  

17

suma.x  struct  numeros{  

       int  a;  

       int  b;  

};  

 

program  ADICIONPROG{  

       version  ADDITIONVERS{  

               int  SUMA(numeros)=1;  

       }=1;  

}=  0x2fffffff;

18

Compilar  y  ejecutar  n  make  –f  M  akefile.suma    

n  Servidor  n  sudo  ./suma_server    

n  Cliente  n  ./suma_client  

n  parece  que  no  hace  nada  o  hace  nada    

19

Agregar  un  mensaje  n  Modificar  la  plan2lla  suma_server.c  

 

n  Volver  a  compilar/ejecutar    observar  que  ocurre  

 

20

#include "suma.h" int *suma_1_svc(numeros *argp, struct svc_req *rqstp){ static int result; /* * insert server code here */ printf( “Peticion acpetada\n ”); return &result; }

suma_client.c  n  Cómo  se  pueden  pasar  parámetros  al  servidor?  

21

suma_client.c  

n  Cómo  se  pueden  pasar  parámetros  al  servidor?  n  Modificar  de  

 a        

n  Hacer  los  cambios  necesarios  en  el  main  

   

22

adicionprog_1(char *host, int a, int b){! CLIENT *clnt;! int *result_1;! numeros suma_1_arg;! suma_1_arg.a=a;! suma_1_arg.b=b; ...!

adicionprog_1(char *host){! CLIENT *clnt;! int *result_1;! numeros suma_1_arg;! "

server_client.c  

n  Cómo  acceder  los  parámetros  desde  el  servidor?  

23

server_client.c  

n  Cómo  acceder  los  parámetros  desde  el  servidor?  

 

   

 

n  Cómo  se  imprimiría  el  resultado  del  lado  del  cliente?  

24

int * suma_1_svc(numeros *argp, struct svc_req *rqstp){! static int result;! int a= argp->a, b=argp->b;! printf("Tu quieres sumar los numeros a=%d, b=%d\n", a,b);! result=argp->a+argp->b;! return &result;!}!

Remarks  n  Los  procedimientos  remotos  u2lizan  punteros  como  argumentos.  

n  Generalmente  regresan  punteros  n  En  general  los  procedimientos  remotos  son    nombrados  u2lizando  el  nombre  de  la  función  en  minúsculas  y  agregando  “_”  y  el  número  de  versión  (v.g  SUMA  -­‐>  suma_1)  

n  RPC  language  (el  u2lizado  en  Q.x)  soporta,  defini2on,  enumera2on,  union,  enumera2ons,  typedef    y  Constants  

25

Reglas  de  definición    programs    

26

PROGRAM_DEFINITION: program <program-ident> {

VERSION-LIST } = valor; VERSION-LIST: VERSION ; | VERSION ; VERSION-LIST VERSION: version <version-id> { PROCEDURE-LIST } = valor; PROCEDURE-LIST: PROCEDURE ; | PROCEDURE-LIST PROCEDURE: <tipo> <procedure-ident> (<tipo>) = valor;

/* Calculadora RPC */ program RPCCAL{ version RPCCALVERS{ int SUMA(numeros)=1; int RESTA(numeros)=2; int PRODUCTO(numeros)=3; }=1; }=44;