Você está na página 1de 14

RPC - Remote Procedure Call Implementao da SUN Microsystems

1 - Introduo 2 - Gerao de um programa RPC 3 - Arquivo de Especificao RPC 4 - Arquivo de Cabealho RPC 5 - Cliente RPC 6 - Servidor RPC 7 - Etapas envolvidas em chamadas RPC

Pag. 1

1 Introduo
O RPC da Sun consiste das seguintes partes:
rpcgen, um compilador que toma a definio de uma interface de procedimento remoto e gera os stubs do cliente e do servidor. XDR (eXternal Data Representation), uma forma padro de codificao de dados de maneira portvel entre diferentes sistemas. Uma biblioteca run-time para tratar de todos os detalhes.

Pag. 2

2 - Gerao de um programa RPC


Usaremos um exemplo simples para mostrar o que est envolvido na escrita de um cliente e de um servidor que utilizam RPC. Considere as seguintes funes chamadas por um cliente usando RPC:
bin_date_1: retorna a hora atual, como o nmero de segundos passados desde 00:00:00 GMT de 1o. De janeiro de 1970. Esta funo no tem argumentos e retorna um inteiro longo (long int). str_date_1, toma um valor inteiro longo da funo anterior e o converte em uma string ASCII, adequada ao consumo humano.
Pag. 3

... 2 - Gerao de um programa RPC


Arquivos envolvidos na gerao de um programa RPC da Sun
Proced. do servidor Progr. do servidor

date_proc.c
Arq. Especif. RPC

Stub do servidor

cc

date_svc.c

date_svc.c rpcgen date.h date_clnt.c Biblioteca run-time RPC


Progr. do cliente

date.x

main( ) do cliente

Stub do cliente

rdate.c

cc

rdate
Pag. 4

... 2 - Gerao de um programa RPC


Para se gerar uma aplicao que use RPC, o que se tem a fazer prover os 3 arquivos mostrados no lado esquerdo da figura anterior:
os procedimentos do servidor, que so chamados remotamente pelo cliente, o arquivo de especificao RPC e a funo main( ) do cliente

O compilador rpcgen toma o arquivo date.x e gera dois novos arquivos .c, os stubs do cliente e do servidor, alm de um arquivo cabealho, que includo em ambos os stubs.
Pag. 5

... 2 - Gerao de um programa RPC


O stub do cliente compilado junto com a funo main( ) dele para gerar o programa executvel do cliente: cc -o rdate rdate.c date_clnt.c -lrpclib De forma anloga, o programa servidor gerado pela compilao do seu stub (que contm a funo main() para o servidor) junto com o arquivo de procedimentos do servidor: cc -o date_svc date_proc.c date_svc.c -lrpclib
Pag. 6

3 - Arquivo de Especificao RPC

/* date.x - Specification of remote date and time service. * * Define 2 procedures: * bin_date_1(): returns the binary time and date (no args) * str_date_1(): takes a binary time and returns a human* readable string. */ program DATE_PROG { version DATE_VERS { long BIN_DATE(void) = 1; /* procedure number = 1 */ string STR_DATE(long) = 2; /* procedure number = 2 */ } = 1; /* version number = 1 */ } = 0x31234567; /* program number = 0x31234567 */
Pag. 7

... 3 - Arquivo de Especificao RPC


Declaram-se todos os procedimentos e se especificam seus argumentos e seus valores de retorno. Atribuem-se:
um nmero de procedimento para cada funo (1 e 2, no nosso caso), um nmero de programa (0x31234567) e um nmero de verso (1, no nosso caso).

Pag. 8

... 3 - Arquivo de Especificao RPC


Nmeros de procedimentos iniciam em 0 (zero). Todo programa e verso remotos devem definir o procedimento nmero 0 como o procedimento nulo. Ele no requer nenhum argumento e no retorna nada. automaticamente gerado pelo compilador rpcgen. O seu uso para permitir que um cliente, ao cham-lo, possa verificar que um programa ou verso particular existe. til tambm ao cliente no clculo do round-trip time.
Pag. 9

... 3 - Arquivo de Especificao RPC


Os nmeros de programa so inteiros de 32 bits atribudos da seguinte forma:
de 0x00000000 0x20000000 0x40000000 0x60000000 at 0x1FFFFFFF 0x3FFFFFFF 0x5FFFFFFF 0xFFFFFFFF valores atribudos pelo(a) Sun Usurio Transiente Reservado

Pag. 10

... 3 - Arquivo de Especificao RPC


O compilador rpcgen gera os nomes reais dos procedimentos remotos convertendo os nomes BIN_DATE e STR_DATE para bin_date_1 e str_date_1. O que ele faz na verdade converter para letras minsculas e acrescentar um caracter de sublinhar (underscore) e o nmero da verso.

Pag. 11

... 3 - Arquivo de Especificao RPC


Ns definimos o procedimento BIN_DATE sem receber nenhum parmetro (void) e retornando um inteiro longo como resultado (long). No caso do procedimento STR_DATE, ele toma um inteiro longo como argumento e retorna uma string como resultado. O RPC da Sun permite apenas um nico argumento e um nico resultado. Se forem desejados mais argumentos, devemos usar uma estrutura como parmetro. De forma similar, para retornar mais de um valor, usa-se uma estrutura como valor de retorno.
Pag. 12

4 - Arquivo de Cabealho RPC

#define DATE_PROG #define DATE_VERS #define BIN_DATE extern long #define STR_DATE extern char

((u_long) 0x31234567) ((u_long) 1) ((u_long) 1) *bin_date_1(); ((u_long) 2) **str_date_1();

Pag. 13

... 4 - Arquivo de Cabealho RPC


O arquivo de cabealho define o valor de retorno da funo bin_date_1 como um ponteiro para um inteiro longo e o valor de retorno da funo str_date_1 como um ponteiro para um ponteiro de caracter. O RPC da Sun especifica que o procedimento remoto retorne o endereo do valor retornado. Alm disso, passado ao procedimento remoto o endereo de seu argumento, quando este chamado pelo stub do servidor.

Pag. 14

5 - Cliente RPC

/* rdate.c - client program for remote date service. */ #include #include #include <stdio.h> <rpc/rpc.h> "date.h

/* standard RPC include file */ /* file generated by rpcgen */

main(int argc, char *argv[]) { CLIENT *cl; /* RPC handle */ char *server; long *lresult; /* return value from bin_date_1() */ char **sresult; /* return value from str_date_1() */

Pag. 15

... 5 - Cliente RPC

if (argc != 2) { fprintf(stderr, "usage: %s hostname\n", argv[0]); exit(1); } server = argv[1]; /* Create the client "handle." */ if ( (cl = clnt_create(server, DATE_PROG, DATE_VERS, "udp")) == NULL) { /* Couldn't establish connection with server. */ clnt_pcreateerror(server); exit(2); }
Pag. 16

... 5 - Cliente RPC


/* First call the remote procedure "bin_date". */ if ( (lresult = bin_date_1(NULL, cl)) == NULL) { clnt_perror(cl, server); exit(3); } printf("time on host %s = %ld\n", server, *lresult); /* Now call the remote procedure "str_date". */ if ( (sresult = str_date_1(lresult, cl)) == NULL) { clnt_perror(cl, server); exit(4); } printf("time on host %s = %s", server, *sresult); clnt_destroy(cl); exit(0); } /* done with the handle */

Pag. 17

... 5 - Cliente RPC


Chamamos clnt_create para criar um identificador (handle) RPC para o programa e verso especfico em um host. Especificamos tambm o protocolo UDP como o protocolo. Poderamos ter especificado o argumento final como tcp para usar o TCP como protocolo de transporte. Uma vez que temos o identificador, estamos aptos a chamar qualquer dos procedimentos definidos para aquele programa e verso particular.
Pag. 18

... 5 - Cliente RPC


Quando chamamos bin_date_1, o primeiro argumento da chamada o mesmo definido no arquivo de especificao (date.x). O segundo argumento o identificador do cliente. O valor de retorno um ponteiro para um inteiro longo, como visto no arquivo de cabealho date.h, gerado pelo compilador rpcgen. Se um ponteiro para NULL retornado da chamada de procedimento remoto, porque ocorreu um erro. Quando chamamos a funo str_date_1, o primeiro argumento um ponteiro para um inteiro longo.
Pag. 19

6 - Servidor RPC

/* dateproc.c: remote procedures called by server stub. */ #include #include <rpc/rpc.h> "date.h" /* standard RPC include file */ /* file generated by rpcgen */

/* Return the binary date and time. */ long *bin_date_1() { static long timeval; /* must be static */ long time(); /* Unix function */ timeval = time((long *) 0); return(&timeval); }
Pag. 20

10

... 6 - Servidor RPC

/* Convert a binary time and return a human readable string. */ char **str_date_1(long *bintime) { static char *ptr; /* must be static */ char *ctime(); /* Unix function */ ptr = ctime(bintime); return(&ptr); } /* convert to local time */

/* return the address of pointer */

Pag. 21

... 6 - Servidor RPC


A razo de comentarmos que os valores de retorno devem ser variveis estticas (static) porque ambas as funes retornam o endereos destas variveis. Se as variveis no fossem estticas (static) ou externas (extern), isto , fossem variveis automticas, seus valores estariam indefinidos logo aps a instruo return passasse o controle de volta ao stub do servidor, que quem chama os procedimentos remotos.
Pag. 22

11

7 - Etapas envolvidas em chamadas RPC

portmapper daemon (2)

(1)

conta ao port mapper quem somos

date_svc (servidor) (4) Sistema Local

Sistema Remoto

(3) rdate (cliente)

Pag. 23

7 - Etapas envolvidas em chamadas RPC 1a. Etapa


Quando disparamos o programa servidor em um sistema remoto, ele cria (socket) um socket UDP e associa (bind) uma porta qualquer a ele. Ele ento chama uma funo da biblioteca RPC, svc_register, que contacta o processo port mapper, para registrar seu nmero de programa e verso. O port mapper mantm as informaes do nmero do programa, nmero da verso e nmero da porta. O servidor ento aguarda por requisies do cliente. Note que todas as aes desta etapa so feitas pelo stub do servidor, isto , pela funo main() gerada pelo compilador rpcgen.
Pag. 24

12

7 - Etapas envolvidas em chamadas RPC 2a. Etapa


Ao iniciarmos o programa cliente, ele chama a funo clnt_create. Esta chamada especifica o nome do sistema remoto, o nmero do programa, o nmero da verso e o protocolo. Esta funo contacta o port mapper no sistema remoto para encontrar a porta UDP na qual o servidor est escutando.

Pag. 25

7 - Etapas envolvidas em chamadas RPC 3a. Etapa


O programa cliente chama a funo bin_date_1. Esta funo est definida no stub do cliente, que foi gerado pelo compilador rpcgen. Ela envia um datagrama para o servidor, usando o nmero de porta UDP da etapa anterior. A funo bin_date_1 ento espera por uma resposta, retransmitindo a requisio uma determinada quantidade de vezes, se uma resposta no for recebida. O datagrama recebido no sistema remoto pelo stub associado ao programa servidor.
Pag. 26

13

7 - Etapas envolvidas em chamadas RPC ... 3a. Etapa


Este stub (o do servidor) determina qual procedimento est sendo chamado e chama a funo bin_date_1. Quando esta funo retorna ao stub do servidor, o stub toma o valor de retorno, o converte para o formato padro XDR e o empacota em um datagrama para transmiti-lo de volta ao cliente. Quando a resposta recebida, o stub do cliente pega o valor trazido no datagrama, o converte como requerido e o retorna ao programa cliente.
Pag. 27

7 - Etapas envolvidas em chamadas RPC 4a. Etapa


O cliente chama a funo str_date_1, que realiza uma seqncia de operaes similar s descritas na etapa anterior. Uma diferena que o stub do cliente tem que passar um argumento para o procedimento remoto. Nota: O processo port mapper no sistema remoto s precisa ser contactado se um novo identificador de cliente criado e isto s ocorre se um programa ou uma verso diferente forem chamados.
Pag. 28

14

Você também pode gostar