Bueno creo no me supe explicar: recien comienzo trabajando con las llamadas a procedimientos remotos (RPC) estoy tratando de hacer la tipica calculadora donde el cliente solicita una operacion y el servidor debe resolverla, trabajo con rpcgen, este es el codigo que tengo: cabe mencionar que mi pregunta original era como conectar el cliente al servidor a traves de la lan, es decir que cliente y servidor esten en maquinas distintas pero ahora en el codigo me surgen mas dudas por que inicia el servidor y el cliente pero no arrojan datos..
codigo calc.x
#include "operadores.h"
program CALC
{
version CALC_VER
{
int OPCION(operadores) = 1;
} = 5;
} = 10;
codigo operadores.h
struct operadores
{
int a;
int b;
int opcion;
};
los siguientes archivos son generados por rpc gen, ya los modifique:
calc_client.c
#include "calc.h"
void
calc_5(char *host)
{
CLIENT *clnt;
int *result_1;
operadores opcion_5_arg;
#ifndef DEBUG
clnt = clnt_create (host, CALC, CALC_VER, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
#endif /* DEBUG */
result_1 = opcion_5(&opcion_5_arg, clnt);
if (result_1 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}else
{
do
{
printf("-------------------------\n");
printf(" CALCULADORA RPC \n");
printf("-------------------------\n");
printf("Elija una operacion: \n");
printf("1 _> suma \n");
printf("2 _> resta \n");
printf("3 _> multiplicacion \n");
printf("4 _> division \n");
printf("5 _> salir \n");
printf("\n Introduzca su opcion: \n");
scanf("%i", &opcion_5_arg.opcion);
printf("Introduzca el primer numero \n");
scanf("%i", &opcion_5_arg.a);
printf("\n Introduzca el segundo numero \n");
scanf("%i", &opcion_5_arg.b);
printf("El resultado es: %i \n", *result_1);
printf("\n");
}while(opcion_5_arg.opcion != 5);
}
#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];
calc_5 (host);
exit (0);
}
calc_server.c
#include "calc.h"
int *
opcion_5_svc(operadores *argp, struct svc_req *rqstp)
{
static int result;
static int op;
printf("-------------------------\n");
printf(" SERVIDOR EN LINEA\n");
printf("-------------------------\n");
op = argp->opcion;
printf("%i",op);
if(op = 1)
{
result = argp->a + argp->b;
}
if(op = 2)
{
result = argp->a - argp->b;
}
if(op = 3)
{
result = argp->a * argp->b;
}
if(op = 4)
{
result = argp->a / argp->b;
}
return &result;
};
este ultimo archivo no se edita, pero como lo llama desde calc_server entonces lo dejo
calc.h
#ifndef _CALC_H_RPCGEN
#define _CALC_H_RPCGEN
#include <rpc/rpc.h>
#ifdef __cplusplus
extern "C" {
#endif
struct operadores {
int a;
int b;
int opcion;
};
typedef struct operadores operadores;
#define CALC 10
#define CALC_VER 5
#if defined(__STDC__) || defined(__cplusplus)
#define OPCION 1
extern int * opcion_5(operadores *, CLIENT *);
extern int * opcion_5_svc(operadores *, struct svc_req *);
extern int calc_5_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define OPCION 1
extern int * opcion_5();
extern int * opcion_5_svc();
extern int calc_5_freeresult ();
#endif /* K&R C */
/* the xdr functions */
#if defined(__STDC__) || defined(__cplusplus)
extern bool_t xdr_operadores (XDR *, operadores*);
#else /* K&R C */
extern bool_t xdr_operadores ();
#endif /* K&R C */
#ifdef __cplusplus
}
#endif
#endif /* !_CALC_H_RPCGEN */