I can't tell where is the problem, i need this to be done and work. I have the source here and i ask for help.
I think that this program runs only on unix, i want to get this work on knoppix. Note that i am not so good on this.
avg.x
/*
* The average procedure receives an array of real
* numbers and returns the average of their
* values. This toy service handles a maximum of
* 200 numbers.
*/
const MAXAVGSIZE = 200;
struct input_data {
double input_data<200>;
};
typedef struct input_data input_data;
program AVERAGEPROG {
version AVERAGEVERS {
double AVERAGE(input_data) = 1;
} = 1;
} = 22855;
--------------------------------
avg_svc.c
#include "avg.h"
#include <stdlib.h>
void
averageprog_1( char* host, int argc, char *argv[])
{
CLIENT *clnt;
double *result_1, *dp, f;
char *endptr;
int i;
input_data average_1_arg;
average_1_arg.input_data.input_data_val =
(double*) malloc(MAXAVGSIZE*sizeof(double));
dp = average_1_arg.input_data.input_data_val;
average_1_arg.input_data.input_data_len =
argc - 2;
for (i=1;i<=(argc - 2);i++) {
f = strtod(argv[i+1],&endptr);
printf("value = %e\n",f);
*dp = f;
dp++;
}
clnt = clnt_create(host, AVERAGEPROG,
AVERAGEVERS, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
}
result_1 = average_1(&average_1_arg, clnt);
if (result_1 == NULL) {
clnt_perror(clnt, "call failed:");
}
clnt_destroy( clnt );
printf("average = %e\n",*result_1);
}
main( int argc, char* argv[] )
{
char *host;
if(argc < 3) {
printf(
"usage: %s server_host value ...\n",
argv[0]);
exit(1);
}
if(argc > MAXAVGSIZE + 2) {
printf("Two many input values\n");
exit(2);
}
host = argv[1];
averageprog_1( host, argc, argv);
}
--------------------------------------
ravg.c
#include <rpc/rpc.h>
#include "avg.h"
#include <stdio.h>
static double sum_avg;
double * average_1(input_data *input,
CLIENT *client) {
double *dp = input->input_data.input_data_val;
u_int i;
sum_avg = 0;
for(i=1;i<=input->input_data.input_data_len;i++) {
sum_avg = sum_avg + *dp; dp++;
}
sum_avg = sum_avg /
input->input_data.input_data_len;
return(&sum_avg);
}
double * average_1_svc(input_data *input,
struct svc_req *svc) {
CLIENT *client;
return(average_1(input,client));
}
make
BIN = ravg avg_svc
GEN = avg_clnt.c avg_svc.c avg_xdr.c avg.h
RPCCOM = rpcgen
all: $(BIN)
ravg: ravg.o avg_clnt.o avg_xdr.o
$(CC) -o $@ ravg.o avg_clnt.o avg_xdr.o
ravg.o: ravg.c avg.h
$(CC) -g ravg.c -c
avg_svc: avg_proc.o avg_svc.o avg_xdr.o
$(CC) -o $@ avg_proc.o avg_svc.o avg_xdr.o<\n>
avg_proc.o: avg_proc.c avg.h
$(GEN): avg.x
$(RPCCOM) avg.x
clean cleanup:
rm -f $(GEN) *.o $(BIN)