Linux RPC中XDR 外部数据编码实例

网上找了很多XDR编码的内容,但是大多都是介绍相关的,很少有编程实例。因为分布式的课程学习了XDR外部数据编码,并应用在了RPC远程过程调用的实现中。本篇博客先暂时描述XDR相关,下一篇将介绍Socket通信。

这一篇博客介绍了XDR的内部实现 http://blog.csdn.net/chdhust/article/details/9004496 ,需要了解实现的可以参考一下。

XDR的主要作用就是在不同进程间传递消息参数时,避免因为计算机平台的不一致而导致数据传送接收异常。它可以对消息参数按照一定的顺序编码,放在一个数据包里(通常是在内存中申请一个一定大小的字符串缓冲区),然后把这个数据包发送给其他平台,然后在按照之前编码的顺序依次解码,并可以获得原来的消息参数。

这一篇博客简单的描述了一个XDR编码实例 http://blog.csdn.net/seulww/article/details/23093913

环境要求:

  Linux 操作系统

  rpc/xdr.h

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<malloc.h>
 4 #include<rpc/xdr.h>
 5 #include<cstring>
 6 using namespace std;
 7
 8 char* func()
 9 {
10     char *res = (char *)malloc(sizeof(char)*1024);
11     sprintf(res,"nihao,你好 \n");
12     return res;
13 }
14
15 int main(int argc,char* argv[])
16 {
17     printf("begin...\n");
18
19     short age = 34;
20     char sex = ‘M‘;
21     double weights = 66.66;
22     char name[20];
23     strcpy(name,"LJ");
24     char *p = name;
25
26
27     XDR xdr;
28     char buff[120];
29
30     xdrmem_create(&xdr,buff,120,XDR_ENCODE);
31     xdr_string(&xdr,&p,sizeof p);
32     xdr_short(&xdr,&age);
33     xdr_char(&xdr,&sex);
34     xdr_double(&xdr,&weights);
35
36     xdrmem_create(&xdr,buff,120,XDR_DECODE);
37     char name2[20];
38     char *p2 = name2;
39     cout<<strlen(p2)<<endl;
40     xdr_string(&xdr,&p2,sizeof p2);
41     short age2;
42     xdr_short(&xdr,&age2);
43     char sex2;
44     xdr_char(&xdr,&sex2);
45     double weights2;
46     xdr_double(&xdr,&weights2);
47
48     printf("%s %d %c %lf\n",p2,age2,sex2,weights2);
49
50     memset(buff,0,sizeof buff);
51     xdrmem_create(&xdr,buff,sizeof buff,XDR_ENCODE);
52     char *p4 = (char *)malloc(sizeof(char)*1024);
53     p4 = func();
54     printf("p4 = %s\n",p4);
55     printf("sizeof p4 = %d\n",(int)(sizeof p4));
56     xdr_string(&xdr,&p4,1024);
57
58     xdrmem_create(&xdr,buff,sizeof buff,XDR_DECODE);
59     char str2[1024];
60     char *p5 = str2;
61     xdr_string(&xdr,&p5,1024);
62
63     printf("str2 = %s\n",str2);
64
65     return 0;
66 }
67
68 /*  FILE* pFile = fopen("in.txt","ab+");
69     XDR xdr;
70     xdrstdio_create(&xdr,pFile,XDR_ENCODE);
71     int n = 299;
72     xdr_int(&xdr,&n);
73     xdr_destroy(&xdr);
74     fclose(pFile);
75 */

详解:

  XDR xdr;  //  定义一个xdr对象

  xdrmem_create(&xdr,buff,120,XDR_ENCODE);  //  创建编码模式,buff是自定义的缓冲区,存放参数,120其实是buff的大小,XDR_ENCODE是编码,相应的XDR_DECODE解码

  xdr_int(&xdr,&n);  //  根据参数类型进行编码  xdr_type(&xdr,&type);

      需要注意的是,字符串的编码要用 xdr_string,并且引用&的参数必须是变量,而不能是字符串的数组名,这是C语言的规则,数组名虽然是数组的首地址指针,但是不是变量,不能引用&。

  xdrmem_create(&xdr,buff,120,XDR_DECODE);  //  解码过程和编码过程放过来,具体参考代码

注意代码中绿色被注释部分:

  是xdr文件编码的方式,而不是使用内存中的缓冲区来存储信息,使用方式类似的。

列举一些常用的编码函数(来自Linux中xdr.h):

/* XDR using memory buffers */
extern void xdrmem_create (XDR *__xdrs, const caddr_t __addr,
               u_int __size, enum xdr_op __xop) __THROW;

/* XDR using stdio library */
extern void xdrstdio_create (XDR *__xdrs, FILE *__file, enum xdr_op __xop)
     __THROW;

/*
 * These are the "generic" xdr routines.
 * None of these can have const applied because it‘s not possible to
 * know whether the call is a read or a write to the passed parameter
 * also, the XDR structure is always updated by some of these calls.
 */
extern bool_t xdr_void (void) __THROW;
extern bool_t xdr_short (XDR *__xdrs, short *__sp) __THROW;
extern bool_t xdr_u_short (XDR *__xdrs, u_short *__usp) __THROW;
extern bool_t xdr_int (XDR *__xdrs, int *__ip) __THROW;
extern bool_t xdr_u_int (XDR *__xdrs, u_int *__up) __THROW;
extern bool_t xdr_long (XDR *__xdrs, long *__lp) __THROW;
extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW;
extern bool_t xdr_hyper (XDR *__xdrs, quad_t *__llp) __THROW;
extern bool_t xdr_u_hyper (XDR *__xdrs, u_quad_t *__ullp) __THROW;
extern bool_t xdr_longlong_t (XDR *__xdrs, quad_t *__llp) __THROW;
extern bool_t xdr_u_longlong_t (XDR *__xdrs, u_quad_t *__ullp) __THROW;
extern bool_t xdr_int8_t (XDR *__xdrs, int8_t *__ip) __THROW;
extern bool_t xdr_uint8_t (XDR *__xdrs, uint8_t *__up) __THROW;
extern bool_t xdr_int16_t (XDR *__xdrs, int16_t *__ip) __THROW;
extern bool_t xdr_uint16_t (XDR *__xdrs, uint16_t *__up) __THROW;
extern bool_t xdr_int32_t (XDR *__xdrs, int32_t *__ip) __THROW;
extern bool_t xdr_uint32_t (XDR *__xdrs, uint32_t *__up) __THROW;
extern bool_t xdr_int64_t (XDR *__xdrs, int64_t *__ip) __THROW;
extern bool_t xdr_uint64_t (XDR *__xdrs, uint64_t *__up) __THROW;
extern bool_t xdr_quad_t (XDR *__xdrs, quad_t *__ip) __THROW;
extern bool_t xdr_u_quad_t (XDR *__xdrs, u_quad_t *__up) __THROW;
extern bool_t xdr_bool (XDR *__xdrs, bool_t *__bp) __THROW;
extern bool_t xdr_enum (XDR *__xdrs, enum_t *__ep) __THROW;
extern bool_t xdr_array (XDR * _xdrs, caddr_t *__addrp, u_int *__sizep,
             u_int __maxsize, u_int __elsize, xdrproc_t __elproc)
     __THROW;
extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, u_int *__sizep,
             u_int __maxsize) __THROW;
extern bool_t xdr_opaque (XDR *__xdrs, caddr_t __cp, u_int __cnt) __THROW;
extern bool_t xdr_string (XDR *__xdrs, char **__cpp, u_int __maxsize) __THROW;
extern bool_t xdr_union (XDR *__xdrs, enum_t *__dscmp, char *__unp,
             const struct xdr_discrim *__choices,
             xdrproc_t __dfault) __THROW;
extern bool_t xdr_char (XDR *__xdrs, char *__cp) __THROW;
extern bool_t xdr_u_char (XDR *__xdrs, u_char *__cp) __THROW;
extern bool_t xdr_vector (XDR *__xdrs, char *__basep, u_int __nelem,
              u_int __elemsize, xdrproc_t __xdr_elem) __THROW;
extern bool_t xdr_float (XDR *__xdrs, float *__fp) __THROW;
extern bool_t xdr_double (XDR *__xdrs, double *__dp) __THROW;
extern bool_t xdr_reference (XDR *__xdrs, caddr_t *__xpp, u_int __size,
                 xdrproc_t __proc) __THROW;
extern bool_t xdr_pointer (XDR *__xdrs, char **__objpp,
               u_int __obj_size, xdrproc_t __xdr_obj) __THROW;
extern bool_t xdr_wrapstring (XDR *__xdrs, char **__cpp) __THROW;
extern u_long xdr_sizeof (xdrproc_t, void *) __THROW;
时间: 2024-10-18 18:05:57

Linux RPC中XDR 外部数据编码实例的相关文章

向linux内核中添加外部中断驱动模块

本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内核中添加外部中断驱动模块.7.完整驱动程序代码.linux的内核版本为linux2.6.32.2. 一.linux模块的框架以及混杂设备相关知识 1.内核模块的框架如下图所示,其中module_init()(图中有误,不是modules_init)只有在使用insmod命令手动加载模块时才会被调用,

实例讲解Linux系统中硬链接与软链接的创建

导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说起,下面就以实例讲解Linux系统中硬链接与软链接的创建,来实际看看Linux中两种链接方式的不同. 首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现

Linux中IPsec的实现--(实例)

Linux中IPsec的实现 IPsec-VPN: virtual private network--虚拟专用网VPN作用: 通过公网实现远程连接,将私有网络联系起来VPN的类型:1.overlay的VPN,例如IPsec-VPN2.peer-to-peer的VPN,例如MPLS-VPN还可以分为二层VPN和三层VPNIPsec-VPN是三层的VPNIPsec-VPN的分类:1.site-to-site VPN 也叫 LAN-to-LAN VPN (要求两个站点都要有固定的IP)2.EASY-V

php在linux中执行外部命令

目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数.2>反引号.3>popen()函数打开进程,三种方法来实现: 方法一:用PHP提供的专门函数(四个):PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec()1)exec()原型: string exec ( string $co

Linux系统中Ant的安装与实例应用

环境 CentOS6.5 64bit Apache Ant 1.9.4:下载地址:http://ant.apache.org/bindownload.cgi 安装与配置Ant 安装: tar -zxvf apache-ant-1.9.4-bin.tar.gz ln -s apache-ant-1.9.4 ant 配置环境变量 1.将ant添加到系统环境变量 vi /etc/profile 添加: export ANT_HOME=/usr/ant #ant的目录位置 export PATH=$AN

红帽Linux故障定位技术详解与实例(1)

红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行各种操作命令或测试程序的方式对故障环境进行观察,分析,测试,以定位出故障发生的原因. AD:2014WOT全球软件技术峰会北京站 课程视频发布 红帽Linux故障定位技术详解与实例是本文要介绍的内容,主要

php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供一种办事接口的统称. WSDL提供"能办的事的文档说明":  对要提供的服务的一种描述格式.我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型. SOAP提供"请求"的规范:  向服务接口传递请求的格式,包括方法和参数等.你想让人家办事,总得告诉人家

Linux系统中进程的创建

1.Linux中的进程 进程是程序执行的一个实例,也是系统资源调度的最小单位.如果同一个程序被多个用户同时运行,那么这个程序就有多个相对独立的进程,与此同时他们又共享相同的执行代码,在Linux系统中进程的概念类似于任务或者线程(task & threads). 进程是一个程序运行时候的一个实例实际上说的是它就是一个可以充分描述程序以达到了其可以运行状态的的一个数据和代码集合.一个进程会被产生并会复制出自己的子代,类似细胞分裂一样.从系统的角度来看进程的任务实际上就是担当承载系统资源的单位,系统

Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly.本文的笔记试图说明Inline Assembly的基本语法规则和用法(建议英文阅读能力较强的同学直接阅读本文参考资料中推荐的技术文章 ^_^). 注意:由于gcc采用AT&T风格的汇编语法(与Intel Syntax相对应,二者的区别参见这里),因此,本文涉及到的汇编代码均以AT&T Syntax为准. 1. 基本语法规则 内联汇编(或称嵌入汇