You are on page 1of 12

EJEMPLO 1 ECO.

X const MAXLEN = 6500; struct cadena { string buffer<MAXLEN>; }; typedef string resultado<MAXLEN>; program ECO { version ECO_VERS { resultado eco_fun(struct cadena) = 1; } = 1; } = 0x39000000;

ECO.H /* * Please do not edit this file. * It was generated using rpcgen. */ #ifndef _ECO_H_RPCGEN #define _ECO_H_RPCGEN #include <rpc/rpc.h> #ifdef __cplusplus extern "C" { #endif #define MAXLEN 6500 struct cadena { char *buffer; }; typedef struct cadena cadena; typedef char *resultado;

#define ECO 0x39000000 #define ECO_VERS 1 #if defined(__STDC__) || defined(__cplusplus) #define eco_fun 1 extern resultado * eco_fun_1(struct cadena *, CLIENT *); extern resultado * eco_fun_1_svc(struct cadena *, struct svc_req *); extern int eco_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); #else /* K&R C */ #define eco_fun 1 extern resultado * eco_fun_1(); extern resultado * eco_fun_1_svc(); extern int eco_1_freeresult (); #endif /* K&R C */ /* the xdr functions */ #if defined(__STDC__) || defined(__cplusplus) extern bool_t xdr_cadena (XDR *, cadena*); extern bool_t xdr_resultado (XDR *, resultado*); #else /* K&R C */ extern bool_t xdr_cadena (); extern bool_t xdr_resultado (); #endif /* K&R C */ #ifdef __cplusplus } #endif #endif /* !_ECO_H_RPCGEN */ ECO_XDR.C /* * Please do not edit this file. * It was generated using rpcgen. */ #include "eco.h" bool_t xdr_cadena (XDR *xdrs, cadena *objp) { register int32_t *buf; if (!xdr_string (xdrs, &objp->buffer, MAXLEN)) return FALSE; return TRUE;

} bool_t xdr_resultado (XDR *xdrs, resultado *objp) { register int32_t *buf; if (!xdr_string (xdrs, objp, MAXLEN)) return FALSE; return TRUE; }

ECO_CLNT.C /* * Please do not edit this file. * It was generated using rpcgen. */ #include <memory.h> /* for memset */ #include "eco.h" /* Default timeout can be changed using clnt_control() */ static struct timeval TIMEOUT = { 25, 0 }; resultado * eco_fun_1(struct cadena *argp, CLIENT *clnt) { static resultado clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, eco_fun, (xdrproc_t) xdr_cadena, (caddr_t) argp, (xdrproc_t) xdr_resultado, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); }

ECO_CLNT.C

/* * Please do not edit this file. * It was generated using rpcgen. */ #include #include #include #include #include #include #include #include "eco.h" <stdio.h> <stdlib.h> <rpc/pmap_clnt.h> <string.h> <memory.h> <sys/socket.h> <netinet/in.h>

#ifndef SIG_PF #define SIG_PF void(*)(int) #endif static void eco_1(struct svc_req *rqstp, register SVCXPRT *transp) { union { struct cadena eco_fun_1_arg; } argument; char *result; xdrproc_t _xdr_argument, _xdr_result; char *(*local)(char *, struct svc_req *); switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL); return; case eco_fun: _xdr_argument = (xdrproc_t) xdr_cadena; _xdr_result = (xdrproc_t) xdr_resultado; local = (char *(*)(char *, struct svc_req *)) eco_fun_1_svc; break; default: svcerr_noproc (transp); return; } memset ((char *)&argument, 0, sizeof (argument)); if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) { svcerr_decode (transp); return; } result = (*local)((char *)&argument, rqstp);

if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) { svcerr_systemerr (transp); } if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) { fprintf (stderr, "%s", "unable to free arguments"); exit (1); } return; } int main (int argc, char **argv) { register SVCXPRT *transp; pmap_unset (ECO, ECO_VERS); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { fprintf (stderr, "%s", "cannot create udp service."); exit(1); } if (!svc_register(transp, ECO, ECO_VERS, eco_1, IPPROTO_UDP)) { fprintf (stderr, "%s", "unable to register (ECO, ECO_VERS, udp)."); exit(1); } transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf (stderr, "%s", "cannot create tcp service."); exit(1); } if (!svc_register(transp, ECO, ECO_VERS, eco_1, IPPROTO_TCP)) { fprintf (stderr, "%s", "unable to register (ECO, ECO_VERS, tcp)."); exit(1); } svc_run (); fprintf (stderr, "%s", "svc_run returned"); exit (1); /* NOTREACHED */ }

ECO_CLIENT.C /* * 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 "eco.h" void eco_1(char *host) { CLIENT *clnt; resultado *result_1; struct cadena eco_fun_1_arg; char linea[100]; #ifndef DEBUG clnt = clnt_create (host, ECO, ECO_VERS, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } #endif /* DEBUG */ gets(linea); if(!strcmp(linea,"s")) exit(1); eco_fun_1_arg.buffer = linea; result_1 = eco_fun_1(&eco_fun_1_arg, clnt); if (result_1 == (resultado *) NULL) { clnt_perror (clnt, "call failed"); } puts (*result_1); #ifndef DEBUG clnt_destroy (clnt); #endif /* DEBUG */ } int main (int argc, char *argv[]) { char *host;

if (argc < 2) { printf ("usage: %s server_host\n", argv[0]); exit (1); } host = argv[1]; while(1) eco_1 (host); exit (0); } ECO_SERVER.C /* * 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 "eco.h" resultado * eco_fun_1_svc(struct cadena *argp, struct svc_req *rqstp) { static resultado result; /* * insert server code here */ result = argp->buffer; return &result; }

La siguiente captura muestra el correcto funcionamiento del ejemplo donde se implementa una aplicacion cliente-ervidor utilizando programacion RPC nivel bajo cuya funcion es hacer echo en la consola, desde el cliente al servidor.

EJEMPLO 2 ECO.X const MAXLEN = 6500; struct cadena { string buffer<MAXLEN>; };

ECO.H /* * Please do not edit this file. * It was generated using rpcgen. */ #ifndef _ECO_H_RPCGEN #define _ECO_H_RPCGEN #include <rpc/rpc.h> #include <stdio.h> #include <stdlib.h> #define MAXLEN 6500 #ifdef __cplusplus extern "C" { #endif #define MAXLEN 6500 struct cadena { char *buffer; }; typedef struct cadena cadena; /* the xdr functions */ #if defined(__STDC__) || defined(__cplusplus) extern bool_t xdr_cadena (XDR *, cadena*); #else /* K&R C */ extern bool_t xdr_cadena (); #endif /* K&R C */ #ifdef __cplusplus }

#endif #endif /* !_ECO_H_RPCGEN */ #define ECO #define ECO_VERSION #define ECO_LINEA ECO_CLI.C 0x32000000 1 1

#include "eco.h" main (int argc, char *argv[]) { char send[6500]; char renv[6500]; char *ptr1; char *ptr2; int n; renv[0] = '\0'; ptr1 = send; ptr2= renv; while(1) { gets(send); n = callrpc(argv[1], ECO,ECO_VERSION, ECO_LINEA, xdr_warpstring,&ptr1, xdr_wrapstring, &ptr2); if(n !=0) printf("error callrpc"); puts(renv); } return(0); }

ECO_SRV.C #include "eco.h" char *eco_linea(struct cadena *); main() { int n; n = registerrpc(ECO, ECO_VERSION, ECO_LINEA, eco_linea, xdr_linea, xdr_cadena); if(n == -1)

{ fprintf(stderr, "error en registerrpc sumar"); exit(1); } svc_run(); fprintf(stderr, "error en svc_run\n"); exit(2); } char *eco_linea(struct cadena *ptr) { static struct cadena resp; resp.buffer = ptr->buffer; return((char *)&resp); }

La presenta corrida muestra el correcto funcionamiento del ejemplo que implementa una aplicacin cliente-servidor como el ejemplo anterior solo que dicho utiliza programacin RPC nivel medio cuya funcin es hacer echo en la consola, desde al cliente al servidor.

You might also like