rpcgen

rpcgen

rpcgen可以自動生成RPC伺服器程式的大多數代碼,它的輸入為一個規格說明檔案,它的輸出為一個C語言的源程式

規格檔案(*.x)包含常量、全局數據類型以及遠程過程的聲明。Rpcgen產生的代碼包含了實現客戶機和伺服器程式所需要的大部分原始碼。他包括參數整理、傳送RPC報文、參數和結果的外部數據表示以及本地數據表示的轉換等。不過在由rpcgen生成的源檔案中,沒有過程的具體實現,所以程式設計師必須要手工編輯這些檔案,實現這些過程。

基本介紹

  • 中文名:rpcgen
  • 所屬領域:計算機
  • 檔案名稱: *.x
  • 相關名詞:Rpcgen –C –a file.x 
自動生成檔案,部分選項,示例程式,

自動生成檔案

檔案名稱
作用
Makefile.file
該檔案用於編譯所有客戶機,伺服器代碼
File_clnt.c
該檔案包含client_stub,程式設計師一般不用修改
File_svc.c
該檔案包含server_stub,程式設計師一般不用修改
File.h
該檔案包含了從說明中產生的所有XDR類型
File_xdr.c
該檔案包含了客戶機和伺服器stub所需的XDR過濾器,程式設計師一般不用修改
File_server.c
如果生成此檔案,則該檔案包含遠程服務的stub
File_client.c
如果生成此檔案,則該檔案包含了骨架客戶機程式。

部分選項

-a 生成所有源程式,包括客戶機和伺服器源程式。
-C 使用ANSI C標準生成編碼。
-c 生成xdr轉碼C程式。(file_xdr.c)。
-l 生成客戶機stubs。(file_clnt.c)
-m 生成伺服器stubs,但是不生成main函式。(file_svc.c)
-s rpcgen –C –s tcp file.x,生成伺服器stubs,用tcp協定,同時生成了main函式。(file_svc.c)
-h 生成頭檔案。
-Sc 生成骨架客戶機程式,(file_client.c),生成後還需要手動添加代碼。
-Ss 生成伺服器程式,(file_server.c),生成後還需要手動添加代碼。
Rpcgen –C file.x 生成file_xdr.c, file.h, Makefile.file, file_svc.c 和 file_clnt.c
Rpcgen –C –a file.x 比上面多生成了2個檔案,file_server.c 和 file_client.c

示例程式

規格檔案(math.x)
/* filename: math.x */
const ADD = 0;
const SUB = 1;
const MUL = 2;
const DIV = 3;
struct MATH
{
int op; /* 0-ADD, 1-SUB, 2-MUL, 3-DIV */
float arg1;
float arg2;
float result;
};
program MATH_PROG
{
version MATH_VER
{
struct MATH MATH_PROC(struct MATH) = 1;
} = 2;
} = 0x20000001;
用 rpcgen –C –a math.x 生成7個檔案,math.h、math_xdr.c、math_svc.c、math_clnt.c、Makefile.math、math_client.c、math_server.c。
在math_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 "math.h"
void math_prog_2(char *host)
{
CLIENT *clnt;
struct MATH *result_1;
struct MATH math_proc_2_arg;
/* 2006/07/04 Dongyy Add -> */
char c;
printf("choose the operation:\n\t0---ADD\n\t1---SUB\n\t2---MUL\n\t3---DIV\n");
c = getchar();
switch(c) {
case '0':
math_proc_2_arg.op = ADD;
break;
case '1':
math_proc_2_arg.op = SUB;
break;
case '2':
math_proc_2_arg.op = MUL;
break;
case '3':
math_proc_2_arg.op = DIV;
break;
default:
printf("error:operate\n");
exit(1);
}
printf("input the first number:");
scanf("%f", &math_proc_2_arg.arg1);
printf("input the second number:");
scanf("%f", &math_proc_2_arg.arg2);
/* <- 2006/07/04 Dongyy Add */
#ifndef DEBUG
clnt = clnt_create (host, MATH_PROG, MATH_VER, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
#endif /* DEBUG */
result_1 = math_proc_2(&math_proc_2_arg, clnt);
if (result_1 == (struct MATH *) NULL) {
clnt_perror (clnt, "call failed");
}
#ifndef DEBUG
clnt_destroy (clnt);
#endif /* DEBUG */
/* 2006/07/04 Dongyy Add -> */
printf("The Result is %.3f \n", result_1->result);
/* <- 2006/07/04 Dongyy Add */
}
int main (int argc, char *argv[])
{
char *host;
if (argc < 2) {
printf ("usage: %s server_host\n", argv[0]);
exit (1);
}
host = argv[1];
math_prog_2 (host);
exit (0);
}
在math_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 "math.h"
struct MATH *
math_proc_2_svc(struct MATH *argp, struct svc_req *rqstp)
{
static struct MATH result;
/*
* insert server code here
*/
/* 2006/07/04 Dongyy Add -> */
switch(argp->op){
case ADD:
result.result = argp->arg1 + argp->arg2;
break;
case SUB:
result.result = argp->arg1 - argp->arg2;
break;
case MUL:
result.result = argp->arg1 * argp->arg2;
break;
case DIV:
result.result = argp->arg1 / argp->arg2;
break;
default:
break;
}
/* <- 2006/07/04 Dongyy Add */
return &result;
}
紅色字型部分為用rpcgen生成代碼後,手動添加的代碼。
添加完後,執行gcc -Wall -o math_server math_server.c math_svc.c math_xdr.c和gcc -Wall -o math_client math_client.c math_xdr.c math_clnt.c 命令, 編譯生成math_client和math_server,在命令行運行math_server &,然後運行math_client 127.0.0.1,按照提示輸入內容就OK了。
參考書籍《Linux C 高級程式設計師指南》

相關詞條

熱門詞條

聯絡我們