老婆的老师要求做个测试RPC通信的程序,主要是为了了解如何使用RPC,老婆婆做到一半出问题了,问我怎
么回事(其实我也不知道
),看看他们的课件吧,不看不知道一看吓一跳,课件做的那叫一个烂啊
,干脆
网上搜搜,找到一个很好的文章,写的很清晰,根据原文,我把我写一个简单的RPC程序的步骤总结如下:
1。先编写一个 “ RPC 语言 ” ( RPC Language ( Remote Procedure Call Language ) ) 的源文件
sum.idl
/*sum.idl*/ struct Vector { int start; int end;
int incr; };
program SQUAREPROG{ version SQUAREVERS{ int SUM(struct Vector)=1; }=1; }=0x30090900; |
2.利用下面命令生成四个文件
#rpcgen sum.idl
#ls
sum.h sum_clnt.c sum_svc.c sum_xdr.c |
3.四个文件
square.h 定义了公用的头文件
square_clnt.c 客户端调用程序,客户端代码需要用到此函数
square_svc.c 标准的服务器端代码
square_xdr.c 类型转换例程,由于在square.idl文件中使用了非常规类型,没有现成的类型转换例程
故生成此文件,用来将本地数据类型转换成网络标准字节顺序
4.使用如下命令生成客户端源文件
#rpcgen -Sc -o sum_client.c sum.idl |
5.使用如下命令生成服务器端源文件
#rpcgen -Ss -o sum_srv_func.c sum.idl |
这是服务器端调用的函数
6.编译生成运行程序
生成服务器程序
#gcc -Wall -o sum_server sum_clnt.c \
sum_srv_func.c sum_svc.c sum_xdr.c |
生成客户端程序
#gcc -Wall -o sum_client sum_clnt.c \
sum_client.c sum_xdr.c |
运行服务器程序
运行客户端程序
#sum_client 192.168.23.129 |
但是由于现的的服务端没有处理客户端请求,所以这样的程序还不能完成任何工作
下面修改 sum_srv_func.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 "sum.h"
int * sum_1_svc(struct Vector *argp, struct svc_req *rqstp) { static int result;
/* * insert server code here */
/* ADD BY MANUL */ struct Vector *item = argp; int i = item->start; result = item->start; while(i <= item->end){ result += i; i += item->incr; } /* END */
return &result; } |
下面修改 sum_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 "sum.h"
void squareprog_1(char *host) { CLIENT *clnt; int *result_1; struct Vector sum_1_arg; /* ADD BY MANUAL */ sum_1_arg.start = 101; sum_1_arg.end = 200; sum_1_arg.incr = 1; /* END */
#ifndef DEBUG clnt = clnt_create (host, SQUAREPROG, SQUAREVERS, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } #endif /* DEBUG */
result_1 = sum_1(&sum_1_arg, clnt); if (result_1 == (int *) NULL) { clnt_perror (clnt, "call failed"); } /* ADD BY MANUAL */ printf("sum from %d to %d with increment %d is %d\n", sum_1_arg.start, sum_1_arg.end, sum_1_arg.incr, *result_1); /* END */ #ifndef DEBUG clnt_destroy (clnt); #endif /* DEBUG */ }
int main (int argc, char *argv[]) { char *host;
if (argc < 2) { printf ("usage: %s server_host\n", argv[0]); exit (1); } host = argv[1]; squareprog_1 (host); exit (0); } |
至此,客户端程序和服务器端程序均修改完毕,实现的功能是:
从客户端传递一个
struct Vector { int start; int end;
int incr; }; |
参数,计算从start到end(递增值为incr)的累加和
我的运行环境是:
两个虚拟机debian(服务器端程序,IP是192.168.23.129)和FC6(客户端程序,IP是192.168.23.131),输出如下
[root@localhost RPC]# ./sum_client 192.168.23.129 sum from 101 to 200 with increment 1 is 15050 [root@localhost RPC]# |
|
文件: |
RPC.rar |
大小: |
3KB |
下载: |
下载 | |
阅读(2505) | 评论(0) | 转发(0) |