转自:

http://www.justwinit.cn/post/3960/

RPC是glibc提供的函数参数/返回值封装服务, 并将封装结果通过网络传到服务器.

RPC服务端首先要启动portmapper服务.

测试一个简单的RPC传输示例, 先定义一个模板文件test.x

program TESTPROG{

version VERSION{

int int_echo(int)=1;

int get_str_len(string)=2;

int add ( int, int ) = 3;

}=1;

}=30000;内含3个函数, 注意其中一个有2个参数.

然后可以用rpcgen生成一个Makefile:

rpcgen -a -N test.x

这会生成Makefile, 客户端和服务端的程序, 和函数示例.

我们手工修改一下Makefile

# This is a template Makefile generated by rpcgen

# Parameters

CLIENT = test_client

SERVER = test_server

SOURCES_CLNT.c =

SOURCES_CLNT.h =

SOURCES_SVC.c =

SOURCES_SVC.h =

SOURCES.x = test.x

TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c

TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c

TARGETS = test.h test_xdr.c test_clnt.c test_svc.c

OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)

OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)

# Compiler flags

CFLAGS += -g -pipe

LDLIBS += -lnsl

RPCGENFLAGS = -N

# Targets

all : $(CLIENT) $(SERVER)

$(TARGETS) : $(SOURCES.x)

rpcgen $(RPCGENFLAGS) $(SOURCES.x)

$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)

$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)

$(CLIENT) : $(OBJECTS_CLNT)

$(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)

$(SERVER) : $(OBJECTS_SVC)

$(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)

clean:

$(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)

修改test_server.c服务端的处理函数, 提供3种服务:

/*

* 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 "test.h"

int *

int_echo_1_svc(int arg1,  struct svc_req *rqstp)

{

static int  result;

//echo.

result=arg1;

printf("[RPC1] source=%d, echo=%d\n", arg1, result);

return &result;

}

int *

get_str_len_1_svc(char *arg1,  struct svc_req *rqstp)

{

static int  result;

//get strlen.

result=strlen(arg1);

printf("[PRC2] str=%s, len=%d\n", arg1, result);

return &result;

}

int *

add_1_svc(int arg1, int arg2,  struct svc_req *rqstp)

{

static int  result;

result=arg1+arg2;

printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);

return &result;

}

客户端test_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 "test.h"

void

testprog_1(char *host)

{

CLIENT *clnt;

int  *result_1;

int int_echo_1_arg1=55;

int  *result_2;

char *get_str_len_1_arg1="Hello, world";

int  *result_3;

int add_1_arg1=10;

int add_1_arg2=20;

clnt = clnt_create (host, TESTPROG, VERSION, "udp");

if (clnt == NULL) {

clnt_pcreateerror (host);

exit (1);

}

result_1 = int_echo_1(int_echo_1_arg1, clnt);

if (result_1 == (int *) NULL) {

clnt_perror (clnt, "call failed");

}

else

printf("[PRC1] echo %d, source %d\n", *result_1,

int_echo_1_arg1);

result_2 = get_str_len_1(get_str_len_1_arg1, clnt);

if (result_2 == (int *) NULL) {

clnt_perror (clnt, "call failed");

}

else

printf("[RPC2] return %d, should %d\n", *result_2,

strlen(get_str_len_1_arg1));

result_3 = add_1(add_1_arg1, add_1_arg2, clnt);

if (result_3 == (int *) NULL) {

clnt_perror (clnt, "call failed");

}

else

printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,

*result_3);

clnt_destroy (clnt);

}OK, 可以调用make了.

生成可执行程序test_server和test_client.

我们启动./test_server, 用rpcinfo看看:

$rpcinfo -p 127.0.0.1

program vers proto port

100000 2 tcp 111 portmapper

30000 1 udp 36307

30000 1 tcp 34883

Bingo! 启动成功.

再开个终端, 尝试一下调用.

./test_client 127.0.0.1

[PRC1] echo 55, source 55

[RPC2] return 12, should 12

[PRC3] 10+20=30

正是我们期望的.

Add By:Jackxiang

make -f Makefile.test

rpc进程Linux,linux RPC 测试(转载)相关推荐

  1. Linux安装rpc监控系统资源

    Linux安装rpc监控系统资源 1.rpc服务需rsh的支持,一般情况下rsh已安装.rpm -qa rsh查看. 2.右键另存为http://heanet.dl.sourceforge.net/s ...

  2. 【转载】Linux Shell-条件测试

    测试 Linux 的Shell中存在一组测试命令,该组命令用于测试某种条件或某几种条件是否真实存在.测试命令是判断语句和循环语句中条件测试工具,所以,其对于编写Shell非常重要. 测试结构 测试命令 ...

  3. Linux内核RPC请求过程

    这篇文章讲讲server端RPC报文的处理流程.server端RPC报文的处理函数是svc_process,这个函数位于net/sunrpc/svc.c中.这个函数须要一个svc_rqst结构的指针作 ...

  4. linux停止rpc服务,Linux系统安装启动rpc服务,解决Loadrunner监控不到资源问题

    前言:在LoadRunner Controller下添加Unix Resource Graphs时,报错如下: Monitor name :UNIX Resources. Cannot initial ...

  5. 区块链-Linux下USDT测试节点搭建

    本文转载自https://lhalcyon.com/blockchain-usdt-node/ Tether Limited 公司基于 Omni Layer 这层协议(Omni Layer proto ...

  6. oracle EBS查进程,UNIX/LINUX 上针对Oracle EBS 11i的运行的所有进程状态的查询方法:

    ..........[@more@]UNIX/LINUX 上针对Oracle EBS 11i的运行的所有进程状态的查询方法: 查看Oracle db进程 ps –ef|grep ora_ 查看Net8 ...

  7. 【Linux 系统启动优化测试工具的使用——grabserial 】

    Linux 系统启动优化测试工具的使用--grabserial Linux 系统启动优化测试工具的使用--grabserial 1.grabserial工具安装 2.grabserial工具使用 3. ...

  8. Kali Linux Web 渗透测试— 第十二课-websploit

    Kali Linux Web 渗透测试- 第十二课-websploit 文/玄魂 目录 Kali Linux Web 渗透测试- 第十二课-websploit..................... ...

  9. linux里进程监控和自动重启,Linux - linux进程监控和自动重启的简单实现

    linux进程监控和自动重启的简单实现 目的:linux 下服务器程序会由于各类缘由dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能.linux 实现原理:由定时任务crontab调 ...

  10. RPC框架性能基本比较测试

    from: http://www.useopen.net/blog/2015/rpc-performance.html RPC框架性能基本比较测试 gRPC是Google最近公布的开源软件,基于最新的 ...

最新文章

  1. iOS开源项目周报0420
  2. TIOBE公布11月榜单:Python势不可挡,超越Java !
  3. Error: Visual Inheritance is currently disabled because the base … (NET CF)
  4. MySQL8.0连接url
  5. partial 分部类-庞大类的瘦身计划
  6. 人生也要一个中心两个基本点(转载)
  7. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌1.33%
  8. 怎么解决tomcat端口占用问题?
  9. 数据结构和算法二十一
  10. 「实在RPA学院」电商运营36计:企微批量自动加好友
  11. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化
  12. https安全证书过期的原因
  13. php判断0点到7点凌晨时间段的方法
  14. 开发手机蓝牙硬件APP如何实现蓝牙自动重连机制
  15. Excel表格密码保护的解除方法
  16. 《途客圈创业记:不疯魔,不成活》一一2.3 早期产品
  17. Uniswap 的做市原理
  18. 2022年茶艺师(中级)报名考试及茶艺师(中级)作业考试题库
  19. 机器学习——朴素贝叶斯
  20. 三连杆平面机器人的动力学

热门文章

  1. java实现分发_关于JAVA中事件分发和监听机制实现的代码实例
  2. 小甲鱼-010-012列表
  3. 使用Apache搭建个人用户主页
  4. PythonNote01_HTML标签
  5. Java 中的四种引用及垃圾回收策略
  6. Sql Server查询语句的一些小技巧
  7. 如何消除网站安全的七大风险
  8. 如何避免安装SQL2005的COM+错误
  9. linux系列(六):rmdir命令
  10. nginx 入门配置