分享
 
 
 

rpcgen

王朝百科·作者佚名  2010-03-03
窄屏简体版  字體: |||超大  

rpcgen 简介

rpcgen可以自动生成RPC服务器程序的大多数代码,它的输入为一个规格说明文件,它的输出为一个C语言的源程序。规格文件(*.x)包含常量、全局数据类型以及远程过程的声明。Rpcgen产生的代码包含了实现客户机和服务器程序所需要的大部分源代码。他包括参数整理、发送RPC报文、参数和结果的外部数据表示以及本地数据表示的转换等。不过在由rpcgen生成的源文件中,没有过程的具体实现,所以程序员必须要手工编辑这些文件,实现这些过程。

Rpc自动生成的文件

文件名

作用

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

如果生成此文件,则该文件包含了骨架客户机程序。

Rpcgen的部分选项

-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_client.c

Rpcgen –C –a file.x 比上面多生成了2个文件,file_server.c和file_client.c

Rpcgen示例程序

规格文件(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:

0---ADD

1---SUB

2---MUL

3---DIV

");

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

");

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

", result_1->result);

/* <- 2006/07/04 Dongyy Add */

}

int main (int argc, char *argv[])

{

char *host;

if (argc < 2) {

printf ("usage: %s server_host

", 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生成代码后,手动添加的代码。

添加完后,执行make –f makefile.math 编译生成math_client和math_server,在命令行运行math_server &,然后运行math_client 127.0.0.1,按照提示输入内容就OK了。

参考书籍《Linux C 高级程序员指南》

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有