Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1952661
  • 博文数量: 261
  • 博客积分: 8073
  • 博客等级: 中将
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-10 15:23
文章分类

全部博文(261)

文章存档

2013年(1)

2012年(1)

2011年(50)

2010年(34)

2009年(4)

2008年(17)

2007年(55)

2006年(99)

分类:

2007-04-03 18:15:08

    老婆的老师要求做个测试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_server &
 
  运行客户端程序
 
#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) |
0

上一篇:杨老师的话

下一篇:实习/工作资料

给主人留下些什么吧!~~