Linux RPC远程调用示例
来源:互联网 发布:数据运维服务 编辑:程序博客网 时间:2024/06/11 11:06
客户端给服务器端发送一个包含2给整数的字符串,服务器端发回他们的和。
1. radd.x
/* radd.x *//* RPC declarations for add program *//* http://zhoulifa.bokee.com/6129455.html *//* ------------------------------------------------------------------* RADDPROG -- remote program that provides Two Int Add* ------------------------------------------------------------------ */program RADDPROG /* name of remote program ( not used ) */{ version RADDVERS /* declaration of version ( see below ) */ { int IntAdd ( string ) = 1; /* first procedure in this program */ } = 1; /* definition of the program version */} = 0x30090949; /* remote program number ( must be unique ) */
上面代码的含义是,服务器端包含一个函数IntAdd,其参数为string,返回int。
2. 使用rpcgen生成所需文件
server端
rpcgen -Ss -o radd_srv_func.c radd.x
client端
rpcgen -Sc -o radd_client.c radd.x
Makefile文件
rpcgen -Sm radd.x > Makefile
3. 修改radd_srv_func.c,添加函数功能
#include "radd.h"int *intadd_1_svc(char **argp, struct svc_req *rqstp){static int result;/* * insert server code here */int num1, num2;sscanf(*argp, "%d %d", &num1, &num2);result = num1 + num2;return &result;}
4. 修改radd_client.c#include "radd.h"voidraddprog_1(char *host){CLIENT *clnt;int *result_1;char * intadd_1_arg;#ifndefDEBUGclnt = clnt_create (host, RADDPROG, RADDVERS, "udp");if (clnt == NULL) {clnt_pcreateerror (host);exit (1);}#endif/* DEBUG */char word[256];while(1) {printf("Please input two integers: ");fgets(word, 256, stdin);intadd_1_arg = word;result_1 = intadd_1(&intadd_1_arg, clnt);if (result_1 == (int *) NULL) {clnt_perror (clnt, "call failed");}printf("sum = %d\n", *result_1);}#ifndefDEBUGclnt_destroy (clnt);#endif /* DEBUG */}intmain (int argc, char *argv[]){char *host;if (argc < 2) {printf ("usage: %s server_host\n", argv[0]);exit (1);}host = argv[1];raddprog_1 (host);exit (0);}
5. 修改Makefile# This is a template Makefile generated by rpcgen# ParametersCLIENT = radd_clientSERVER = radd_serverSOURCES_CLNT.c = SOURCES_CLNT.h = SOURCES_SVC.c = SOURCES_SVC.h = SOURCES.x = radd.xTARGETS_SVC.c = radd_svc.c radd_srv_func.cTARGETS_CLNT.c = radd_clnt.c radd_client.cTARGETS = radd.h radd_clnt.c radd_svc.cOBJECTS_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 LDLIBS += -lnslRPCGENFLAGS = # 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)
主要是这三行TARGETS_SVC.c = radd_svc.c radd_srv_func.cTARGETS_CLNT.c = radd_clnt.c radd_client.cTARGETS = radd.h radd_clnt.c radd_svc.c
6. make,然后即可运行生成的可执行文件运行server端,需要安装portmap,并执行portmap start命令。(开启端口映射功能)root@ubuntu:~/下载/RPC/add# ./radd_client 127.0.0.1Please input two integers: 5 5sum = 10Please input two integers: 6 6sum = 12
- Linux RPC远程调用示例
- RPC远程调用问题
- xml-rpc远程调用
- 远程过程调用(RPC)
- Rpc远程过程调用
- RPC远程过程调用
- RPC远程调用编程
- 远程过程调用RPC
- RPC远程过程调用
- RPC 远程过程调用
- RPC远程过程调用
- 远程过程调用(RPC)
- RPC远程调用
- 远程调用RPC
- RPC远程调用
- 远程过程调用 (RPC)
- RPC远程过程调用
- 远程过程调用RPC
- 关于零拷贝的求助贴
- js获取浏览器窗口属性
- 关于图片合成的范例
- AJAX & IE Caching Issues
- Writing an Android Sync Provider: Part 2
- Linux RPC远程调用示例
- android 自定义发彩信实现(不调用系统发彩信界面)
- URAL 1013. K-based Numbers. Version 3
- JavaScript内存释放
- ldd命令原理及用法例子
- 原来失而复得是这样一种心情
- MFC设计局域网对战五子棋游戏(四)GDI+和GDI混合双缓冲绘图
- Socket编程
- flex入门学习笔记