[API] RPC programming

rpc 설치
sudo apt-get install rpcbind -y

확장자가 .x 인 파일을 하나 생성한다.

add.x라는 파일을 하나 만들고 아래와 같이 입력한다.

add.x
struct Numbers{
        int num1;
        int num2;
};

program ADDITION{
        version ADDITION_1{
                int ADD(Numbers)=1;     //Service number 1
        } = 1;  //Version number (typically start at 1)
} = 0x2fffffff; //Program number: 20000000 ~ 3fffffff(defined by user)

주석은 달면 rpcgen이 안된다. 주석은 빼고 적자!!

rpcgen -a -C add.x

rpcgen(rpc generator)를 실행하고 나면, 아래와 같은 파일들이 생성된다.

add_server.c
add_client.c
add_svc.c
add_xdr.c
add.h
makefile.add
add.clnt.c

이 중에서 add_server.c, add_client.c만 수정하면 된다.

add_server.c
#include "add.h"

int *
add_1_svc(Numbers *argp, struct svc_req *rqstp)
{
        static int  result;
        printf("server : %d + %d = \n",argp->num1,argp->num2);
        fflush(stdout);
        result = argp->num1 + argp->num2;
        return &result;
}
add_client.c
#include "add.h"


void
addition_1(char *host)
{
        CLIENT *clnt;
        int  *result_1;
        Numbers  add_1_arg;
#ifndef DEBUG
        clnt = clnt_create (host, ADDITION, ADDITION_1, "udp");
        if (clnt == NULL) {
                clnt_pcreateerror (host);
                exit (1);
        }
#endif  /* DEBUG */
//=============================================
        scanf("%d",&add_1_arg.num1);
        scanf("%d",&add_1_arg.num2);

        result_1 = add_1(&add_1_arg, clnt);
        if (result_1 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }else{
                printf("sum = %d\n",*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];
        addition_1 (host);
exit (0);
}

컴파일은 아래와 같이 한다.

make -f Makefile.add

그 후 서버단에서 ./add_server로 실행시키고

클라이언트 단에서 ./add_client localhost로 실행 시키면 된다. 결과는 아래와 같다.

client
username:~/Dir$ ./add_client localhost
10 9
sum = 19
username:~/Dir$ ./add_client localhost
999 1
sum = 1000
server
server : 10 + 9 = 
server : 999 + 1 = 

나머지는 일반적인 C언어와 다를것이 없는것 같다.