Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81875
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 331
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-17 19:34
文章分类

全部博文(12)

文章存档

2014年(1)

2013年(11)

我的朋友

分类: LINUX

2013-07-01 15:42:17

一、概述
   C语言进行rpc编程时可以使用rpcgen自动生成分布式的程序代码文件,自己只需要编写***.x(RPC源文件),客户端、服务器端程序以及相应的接口就可以了(总结起来也就最多需要编写5个文件)。下面根据一个实现远程文件传输的rpc调用程序(客户端根据文件名请求文件,服务器端传回相应的文件),具体介绍使用rpcgen编写rpc调用的过程。

我们在本地一般的功能实现的代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXNAME 20
  4. #define MAXLENGTH 1024
  5. char * readfile(char *);
  6. int main()
  7. {
  8.     char name[MAXNAME]; 
  9.     printf("Enter File Name: ");
  10.     scanf("%s", name);
  11.     printf("%s", readfile(name));
  12. }

  13. char * readfile(char * name)
  14. {
  15.     FILE *file = fopen(name, "r");
  16.     char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
  17.     if (file == NULL)
  18.     {
  19.         printf("File Cann't Be Open!");
  20.         return 0;
  21.     }
  22.     printf("The File Content is : /n");
  23.     while (fgets(buf, MAXLENGTH-1, file) != NULL)
  24.     {
  25.         return buf;
  26.     }
  27.     return NULL;
  28. }
接下来我们用rpc来实现该函数的远程实现。

二、实现过程
   1)首先写trans.x文件(该文件是RPC程序的源文件),该文件主要定义了RPC的程序号、版本号以及使用的传输函数。我们这个程序的trans.x的代码如下:

点击(此处)折叠或打开

  1. const MAXLENGTH =1024;
  2. const MAXNAME = 20;

  3. program FILETRANSPROG
  4. {
  5.     version FILETRANSVERS
  6.     {
  7.       string READFILE(string) = 1;
  8.     }=1;//版本号,这个在后面用rpcgen生成的文件中,会在相应的函数后面加上该版本号
  9. } = 99;//程序号
    2)使用rpcgen trans.x命令将rpc的源文件进行解析。生成三个文件trans.h  trans_clnt.c和trans_svc.c
   3)编写客户端的常规函数(client.c)

点击(此处)折叠或打开

  1. #include "trans.h"

  2. #define RMACHINE "127.0.0.1"
  3. static char **ret;
  4. CLIENT *handle;

  5. char *readfile(char *);
  6. int main(int argc,char **argv)
  7. {
  8.     char name[MAXNAME];
  9.     char *buf;
  10.     printf("Enter File Name: ");

  11.     scanf("%s", name);
  12.     handle = clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");//这句就相当于建立了一个socket连接,其中第一个参数表示的是服务器的ip地址,第二个参数表示的是rpc的程序号,第三个参数表示的版本号

  13.    if (handle == 0) {

  14.          printf("Could Not Connect To Remote Server./n");

  15.          exit(1);

  16.    }

  17.     buf = readfile(name);

  18.     printf("%s", buf);

  19.     return 0;
  20. }

  21. char *readfile(char *name)
  22. {
  23.     char **arg;
  24.     arg = &name;
  25.     ret = readfile_1(arg,handle);//这个函数是通过rpcgen命令在trans.h中生成的。我们在这里直接调用就可以了
  26.     return ret ==NULL?NULL:*ret;
  27. }
    4)编写服务器端的常规函数(server.c)

点击(此处)折叠或打开

  1. #include <rpc/rpc.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "trans.h"
  5. #define MAXNAME 20
  6. #define MAXLENGTH 1024
  7.  
  8. //该函数主要是打开文件,并读取文件的第一行,发送给客户端
  9. char * readfile(char * name)

  10. {
  11.     FILE *file = fopen(name, "r");

  12.     char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
  13.     if (file == NULL)

  14.     {

  15.         printf("File Cann't Be Open!");

  16.         return 0;

  17.     }
  18.     printf("The File Content is : \n");

  19.     while (fgets(buf, MAXLENGTH-1, file) != NULL)

  20.     {

  21.         printf("the buf is %s\n",buf);
  22.         return buf;

  23.     }
  24.     return NULL;

  25. }
5)编写服务器端的接口函数(server_init.c)

点击(此处)折叠或打开

  1. #include <rpc/rpc.h>
  2. #include <stdio.h>

  3. #include "trans.h"
  4. //该函数主要是把服务器端实现的readfile函数封装在reafile_1_svc函数中。这个函数为服务器的接口函数,是客户端和服务器之间进行通信的主要函数,服务器端读取的数据就是通过该函数传递给客户端的。而客户端就是通过read_1客户端接口函数来进行接收数据的。
  5. static char *retcode;
  6. char ** readfile_1_svc(char **w, struct svc_req *s)
  7. {
  8.     retcode = readfile(*(char **)w);
  9.     return &retcode;
  10. }
以上就是我们要实现的代码文件。总结来看我们就只需要实现trans.x、server.c(服务器端的常用函数)、client.c(客户端的常用函数)以及server_init.c(服务器端的接口函数)四个文件即可。
    6)makefile文件:

点击(此处)折叠或打开

  1. TAR = testclient testserver

  2. all:$(TAR)

  3. testclient:testclient.o test_clnt.o
  4.     cc -O3 -o testclient testclient.o test_clnt.o
  5. testclient.o:client.c
  6.     cc -O3 -o testclient.o -c client.c
  7. test_clnt.o:trans_clnt.c
  8.     cc -O3 -o test_clnt.o -c trans_clnt.c

  9. testserver:testserver.o test_srvint.o test_svc.o
  10.     cc -O3 $^ -o $@
  11. test_svc.o:trans_svc.c
  12.     cc -O3 -o test_svc.o -c trans_svc.c
  13. test_srvint.o:test_srvint.c
  14.      cc -O3 -o test_srvint.o -c test_srvint.c
  15. testserver.o:server.c
  16.     cc -O3 -o testserver.o -c server.c

  17. .PHONY:clean
  18. clean:
  19.     rm *.o $(TAR)

上面就是该程序的所有的部分了。编译,然后执行就可以看到相应的效果了。
阅读(3010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~