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

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

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

转载于:https://www.cnblogs.com/chengliu/p/3636352.html

rpcgen的简单讲解及例子程序相关推荐

  1. Vulkan是什么?和我一起完成一个简单的Vulkan应用程序

    在本章,你将学到: Vulkan以及它背后的基本原理: 如何创建一个最简单的Vulkan应用程序: 在本书其余部分将使用到的术语和概念. 本章将介绍并解释Vulkan是什么.我们会介绍API背后的基本 ...

  2. Java基础之泛型简单讲解(通俗易懂)

    Java基础之泛型简单讲解(通俗易懂) 1. 前言 2. 简单例子对比理解 2.1 未使用泛型例子--ArrayList 2.2 使用泛型的例子 2.2.1 ArrayList 举例 2.2.2 Ha ...

  3. 小程序公共封装ajax,超简单 Promise封装小程序ajax 超好用 以及封装登录

    //网络类 //封装网络请求 const ajax = (ajaxData, method) => { wx.showLoading({ title: '加载中', mask: true }); ...

  4. 菜鸟学习Hibernate——简单的一个例子

    一.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了能够使用Hibernate快速上手,我们先讲解一个简单的Hibernate应用实例hibernate ...

  5. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  6. JAVA基础——最简单的多重循环程序

    Java 循环语句之多重循环 循环体中包含循环语句的结构称为多重循环.三种循环语句可以自身嵌套,也可以相互嵌套,最常见的就是二重循环.在二重循环中,外层循环每执行一次,内层循环要执行一圈. 如下所示: ...

  7. php和python交互-Python如何实现简单的用户交互程序(示例)

    本篇文章给大家带来的内容是关于Python如何实现简单的用户交互程序(示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们经常使用的程序都会有与用户交互的程序,比如网页的登录, ...

  8. smarty课程---最最最简单的smarty例子

    smarty课程---最最最简单的smarty例子 一.总结 一句话总结:其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个 ...

  9. 一个最简单的Makefile例子(转)

    原文地址:http://hi.baidu.com/hellosim/blog/item/42e78341b40c3e8db2b7dce3.html 转载请注明出处 1.hello.c #include ...

最新文章

  1. KMeans聚类并绘制聚类后的决策边界
  2. 城市列表简称JSON数据
  3. 电力论文:基于牛顿拉尔逊(直角坐标)的电气潮流计算(python实现)
  4. linux排序语言,Go语言排序sort的使用
  5. python请输入_python中的三种输入方式
  6. 让sourceSafe每天自动备份及修复(适用于vss6.0和vss2005)
  7. 豪郑3000亿、发布6款车,许家印「速成」马斯克?
  8. python实现关键词提取
  9. 服务器高并发应对方案
  10. 中英文对照 —— 英语语法与文法概念
  11. Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL
  12. Windows Phone 更改datePicker的显示格式
  13. [JLOI2015]城池攻占 左偏树
  14. 十四、final关键字
  15. java静态分页_Javaweb分页
  16. STM32MP157 u-boot2021.10移植
  17. 宏观经济的基本指标及其衡量
  18. apex显示服务器连接超时,apex与服务器链接超时
  19. Java 生成随机手机号,并写入数据库
  20. spring cloud alibaba全家桶集合

热门文章

  1. Squid的refresh_pattern配置
  2. nginx和squid配合搭建的web服务器前端系统
  3. Linux的epoll
  4. 将模式对话框的返回值回送(PostBack)到服务端
  5. OpenCV实现遍历文件夹下所有文件
  6. 计算机桌面分页,电脑word文档怎么快速分页?
  7. android怎么播放音频,Android播放音频的两种方式
  8. java object finalize_Java Object finalize() 方法
  9. rockbox主题包安装_微信主题更改流程介绍!超火的猫和老鼠、小黄人等系列等你来设置...
  10. 安卓如何实现多级结构树_数据结构-树(树基本实现C++)