Linux rpc 编程最简单实例

通过rpcgen的man手册看到此工具的作用是把RPC源程序编译成C语言源程序,从而轻松实现远程过程调用。
1.下面的例子程序的作用是客户端程序(fedora Linux下)取中心服务器也是Linux上)时间的,编程过程如下:
先编写一个 “ RPC 语言 ” ( RPC Language ( Remote Procedure Call Language ) ) 的源文件 test.x ,文件后缀名为 x 。
源代码如下:
program TESTPROG {
   version VERSION {
     string TEST(string) = 1;
   } = 1;
} = 87654321;

说明:这里数字87654321是RPC程序编号,还有VERSION版本号为1,都是给RPC服务程序用的。同时指定程序接受一个字符串参数。

(1).运行这个命令:
rpcgen test.x

将生成三个源文件:
test_clnt.c  test.h  test_svc.c

(2).运行下列命令生成一个客户端源文件test_clnt_func.c:
rpcgen -Sc -o test_clnt_func.c test.x

将生成文件:test_clnt_func.c

(3).运行这个命令生成服务端源文件test_srv_func.c:
rpcgen -Ss -o test_srv_func.c test.x

将生成文件:test_srv_func.c

(4)至此,我们就可以编译生成程序来运行了。
用下面的命令编译生成服务端程序test_server:
gcc -Wall -o test_server test_clnt.c test_srv_func.c test_svc.c

用下面的命令编译生成客户端程序test_client:
gcc -Wall -o test_client test_clnt_func.c test_clnt.c

运行下列命令启动服务端:
./test_server

运行下列命令可以进行客户端测试:
./test_client 127.0.0.1

但是由于现的的服务端没有处理客户端请求,所以这样的程序还不能完成任何工作(可能会运行错误,我没仔细查找)。
下面我们先给服务端程序加上代码,使这个服务器能完成一定的工作。即修改 test_srv_func.c ,在 “ * insert server code here ” 后面加上取时间的代码(红色部分),即修改后的 test_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.
http://jiaogen.com
*/
#include <time.h>
#include "test.h"   
char **
test_1_svc(char **argp, struct svc_req *rqstp)
{
        static char * result;
        static char tmp_char[128];
        time_t rawtime;
        /*
         * insert server code here
         */
        if( time(&rawtime) == ((time_t)-1) ) {
                strcpy(tmp_char, "Error");
                result = tmp_char;
                return &result;
        }
        sprintf(tmp_char, "服务器当前时间是 :%s", ctime(&rawtime));
        result = tmp_char;
        return &result;
}

再修改客户端代码以显示服务器端返回的内容(红色部分),即修改test_clnt_func.c源文件,只需要修改其中的函数testprog_1,修改后如下:
void
testprog_1(char *host)
{
        CLIENT *clnt;
        char * *result_1;
        char * test_1_arg;
        test_1_arg = (char *)malloc(128);
#ifndef DEBUG
        clnt = clnt_create (host, TESTPROG, VERSION, "udp");
        if (clnt == NULL) {
                clnt_pcreateerror (host);
                exit (1);
        }
#endif  /* DEBUG */
        result_1 = test_1(&test_1_arg, clnt);
        if (result_1 == (char **) NULL) {
                clnt_perror (clnt, "call failed");
        }
        if (strcmp(*result_1, "Error") == 0) {
                fprintf(stderr, "%s: could not get the time\n", host);
                exit(1);
        }
        printf("收到消息 ... %s\n", *result_1);
#ifndef DEBUG
        clnt_destroy (clnt);
#endif   /* DEBUG */
}

重新运行上述编译命令编译生成程序:
gcc -Wall -o test_server test_clnt.c test_srv_func.c test_svc.c
gcc -Wall -o test_client test_clnt_func.c test_clnt.c

启动服务端程序后运行客户端程序如下:
./test_client 127.0.0.1
收到消息 ... 服务器当前时间是 :Sat Dec 11 15:51:57 2010

参考:

http://blog.csdn.net/hj19870806/article/details/8185604
http://blog.csdn.net/hj19870806/article/details/8185604

时间: 2024-11-06 21:16:26

Linux rpc 编程最简单实例的相关文章

从简入难makefile文件编写,Linux C++编程,简单vi命令

 1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个.o没有,则重新编译没有编译的那个文件 6.最终的makefile文件 总结:makefile是通过.o文件是否存在已经.cpp最后的修改时间来判断是否重新编译.o文件. 7.makefile不管理.h文件,它是编译器来进行管理的. vi: i在光标之前插入 a在光标后面插入 x删除后面的字符 dd删

Linux RPC编程实战要点

当前云计算.大数据发展得如火如荼,作为其主要架构的分布式系统也得以大行其道.而构成分布式系统的一个重要基础功能就是RPC(remote process call),因此了解RPC的基本原理.编程实现和部署方法显得尤为必要. 一.RPC的基本原理 网上介绍RPC的博客比较多,系统和零碎的文章也有不少,个人建议找一两个链接看懂.真正理解即可. 笔者这里想推荐的是<RPC原理详解>和<RPC Porgram>.说简单点,RPC就是基于网络TCP或者UDP协议的通信过程,客户端和服务器端根

linux shell编程之简单shell及windows文件相互转化

什么是shell? ls 出现一堆目录?执行过程是怎样的?ls是应用程序,shell将其转化为01代码转给内核,内核转给硬件,之后再返回! shell同样是强大编程语言! 查看系统支持哪些shell? 命令名称:echo 参数: -e 支持反斜线字符转化 一个小例子: 开始编写一个shell shell执行: 下面来说关于window和linux文件相互转化 转化命令:

cpp面向对象编程的简单实例 用于简单的复数

#include <iostream>using namespace std; class Complex { public: Complex(int a,int b) {re=a;im=b;}; Complex (float a){ storea=a;}; void add(Complex p) { re+=p.storea;} void show(){ cout<<re<<" + "<<im<<"i"&

使用linux-c编程实现简单的ls命令

使用Linux-c编程实现简单的ls命令 具体代码如下:     加载的头文件有stdio.h,sys/types.h,dirent.h,unistd.h,sys/stat.h,fcntl.h,string.h等. void main(int argc,char **argv){      DIR *dir;      struct dirent *rdir;      struct stat statbuf;      char * buffer="/";      char *fi

Linux C Socket编程原理及简单实例

原文:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html 部分转自:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx 1.   什么是TCP/IP.UDP? 2.   Socket在哪里呢? 3.   Socket是什么呢? 4.   有很多的框架,为什么还在从Socket开始? 5.   Linux C Socket简单示例 1.什么是TCP

Linux网络编程——原始套接字实例:简单版网络数据分析器

通过<Linux网络编程--原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 MAC 头部(有线局域网) 注意:CRC.PAD 在组包时可以忽略 链路层数据包的其中一种情况: unsigned char msg[1024] = { //--------------组MAC--------14------ 0xb8, 0x88, 0xe3, 0xe1, 0x10, 0xe6, // dst

Linux网络编程:客户端/服务器的简单实现

一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个Socket都一个半相关描述: {协议, 本地地址, 本地端口} 完整的Socket的描述: {协议, 本地地址, 本地端口, 远程地址, 远程端口} 2. Socket工作流程 面向连接(TCP)的Socket工作流程 UDP的socket工作流程 l 服务器端 首先,服务器应用程序用系统调用so

Linux文件编程实例

//捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define MYFILE "missing.txt" int main(  ) { FILE* fin; fin=fopen( MYFILE,"r" ); if( fin==(FILE*)NULL ) { printf( "%s: %s\n",MYFILE,st