In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. [Source:- Wikipedia]What is rpcbind?
The rpcbind utility is a server that converts RPC program numbers into universal addresses. It must be running on the host to be able to make RPC calls on a server on that machine. - [ $ man rpcbind ]
Install rpcbind ->
sudo apt-get install rpcbind Today we will make a simple RPC for factorial.
First make a .x file
1 2 3 4 5 6 7 8 9 10 | struct values{
int num1;
};
program Fact{
version fact_verse{
float fac(values) = 1;
} = 1;
} = 456789;
|
Here we have a struct called values and a program Fact
save the file. For now we will save as fact.x
Now the file is created run
rpcgen -aC fact.x Now there are several middleware files created. Among them, we need to edit that fact_client.c and fact_server.c
Here is fact_client.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /*
* 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 "test.h"
float
fact_1(int argc, char *host)
{
CLIENT *clnt;
float *result_1;
values fac_1_arg;
fac_1_arg.num1 = argc;
//#ifndef DEBUG
clnt = clnt_create (host, Fact, fact_verse, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
//#endif /* DEBUG */
result_1 = fac_1(&fac_1_arg, clnt);
if (result_1 == (float *) NULL) {
clnt_perror (clnt, "call failed");
}
//#ifndef DEBUG
clnt_destroy (clnt);
//#endif /* DEBUG */
return *result_1;
}
int
main (int argc, char *argv[])
{
char *host;
int num, ans;
printf("Enter a number");
scanf("%d",&num);
if (argc < 1) {
printf ("usage: %s server_host\n", argv[0]);
exit (1);
}
host = argv[1];
ans = fact_1 (num,host);
printf("the factorial is %d",ans);
exit (0);
}
|
Here is fact_server.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /* * 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 "test.h"
float *
fac_1_svc(values *argp, struct svc_req *rqstp)
{
static float result;
/*
* insert server code here
*/
int var = argp->num1;
int ans = factorial(5);
printf("in server %d",ans);
result = ans;
return &result;
}
int factorial(int a){
if (a==1)
return 1;
else
return a*factorial(a-1);
}
|
In the server file we just get the number from the argp parameter, which is the struct we created in the .x file. calculate the factorial and return it.
Have a good day :)
Wait... How to run?
Once you perform the necessary changes, you can make the executable files for that run
make -f Makefile.factWhere do the Makefile.fact came from? It will be created while running the rpcgen command.
Run server
$ ./fact_server Open another terminal run client
$ ./fact_client localhost
0 comments:
Post a Comment