`
myten
  • 浏览: 131975 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言RPC远程调用

阅读更多

系统:LinuxMint mate 17.2 32bit

gcc:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)

rpcgen:rpcgen (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19

 

rpc依赖库 portmap或者 rpcbind

可执行 apt-get install portmap 进行安装,准备完毕后,详见以下步骤

创建规格文件 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_server.c 和math_client.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;
}

 

编译,测试

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_server

另起终端执行: ./math_client 127.0.0.1

如下图

 

各位看官,自行脑补代码实现去。。。。

 

  • 大小: 29.2 KB
分享到:
评论

相关推荐

    rpc远程调用库C语言实现

    利用JSON格式,作为数据体,进行程序间的RPC调用,代码简单、方便。

    RPC程序设计指南CHM

    RPC程序设计内容: 创建接口定义文件、应用程序配置文件; 利用MIDL编译器对上述文件进行编译,来生成C语言格式的服务端程序模块、客户端程序模块、以及共用的...将这些文件编译并链接RPC实时库中,执行颁布式的调用;

    Windows rpc 程序

    该程序使用windows ipc 实现客户端对服务端远程过程调用。其中还涉及到c语言对mysql数据库的连接以及查询等操作。

    基于云风的skynet,搭建开箱即用的微服务框架,提供优雅的服务热更新

    * 基于skynet cluster封装出简单易用的远程rpc调用。 * 支持服务发现。 * 支持http服务长连接。 * 支持http服务路由,中间件模式。 * 支持jwt鉴权。 * 内置日志分割。 快速开始使用与部署: 详细流程请见README.md

    grpc:基于C的gRPC(C ++,Python,Ruby,Objective-C,PHP,C#)

    gRPC-RPC库和框架gRPC是可以在任何地方运行的现代,开源,高性能远程过程调用(RPC)框架。 gRPC使客户端和服务器应用程序可以透明地进行通信,并简化了连接系统的构建。 主页: 邮件列表:开始使用gRPC 为了最大化...

    基于C的gRPC(C ++,Python,Ruby,Objective-C,PHP,C#)-C/C++开发

    gRPC-RPC库和框架gRPC是可以在任何地方运行的现代,开源,高性能的远程过程调用(RPC)框架。 gRPC使客户端和服务器应用程序可以透明地进行通信,并且简化了gRPC-RPC库和框架gRPC是可以在任何地方运行的现代,开源,...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     第十二章 BPC远程过程调用原理和实践  12.1 RPC的原理  12.1.1 XDR的更进一步  12.1.2 本地函数调用的过程  12.1.3 用远程调用来虚拟本地调用  12.2 RPC的实现  12.2.1 远程过程的标识  ...

    CRPC-开源

    具有C语言支持,自己的网络协议,自动并行化,SSL支持和其他功能的RPC(远程过程调用)系统。

    python cookbook(第3版)

    11.6 通过XML-RPC实现简单的远程调用 11.7 在不同的Python解释器之间交互 11.8 实现远程方法调用 11.9 简单的客户端认证 11.10 在网络服务中加入SSL 11.11 进程间传递Socket文件描述符 11.12 理解事件驱动的...

    ROS机器人操作系统入门 Tutorials CN版 20150726

    ROS的客户库通常以一种远程调用的方式提供这样的交互。 Bags: Bags是一种格式,用于存储和播放ROS消息。对于储存数据来说Bags是一种很重要的机制。例如传感器数据很难收集但却是开发与测试中必须的。 在ROS的计算图...

    入门学习Linux常用必会60个命令实例详解doc/txt

    halt执行时,杀死应用进程,执行sync(将存于buffer中的资料强制写入硬盘中)系统调用,文件系统写操作完成后就会停止内核。若系统的运行级别为0或6,则关闭系统;否则以shutdown指令(加上-h参数)来取代。  ...

Global site tag (gtag.js) - Google Analytics