了解XDR规范以创建* .x文件

时间:2014-10-28 12:18:25

标签: c rpc xdr sunrpc

我一直在浏览互联网上的几个网站,实际上想知道我们如何在 .x 文件中编写规范以生成相应的功能RPC的 .c 文件。我访问过的每个网站都建议在 *。x 文件中使用以下类型的规范:

program ADD_PROG { 
    version ADD_VERS { 
        int ADD(intpair) = 1; 
    } = 1; 
} = 0x23451111;

所以,为了实际理解,我从一个名为ganglia的开源项目获得了gm_protocol.x,并使用生成的等效C源代码(gm_protocol_xdr.c)和C头文件(gm_protocol.h)的rpcgen。

[rohit@ganglia-server rpc]$ rpcgen -C gm_protocol.x 
[rohit@ganglia-server rpc]$ 
[rohit@ganglia-server rpc]$ ll
total 24
-rw-rw-r-- 1 rohit rohit 5786 Oct 28 17:52 gm_protocol.h
-rw-rw-r-- 1 rohit rohit 3485 Oct 28 15:04 gm_protocol.x
-rw-rw-r-- 1 rohit rohit 8213 Oct 28 17:52 gm_protocol_xdr.c

令我惊讶的是,根据我的学习和理解,gm_protocol.x不包含上面显示的任何此类RPC规范,但它仍然可以在文件gm_protocol_xdr.c中生成太多函数。

我非常肯定我无法理解XDR规范,因为我咨询了错误的来源或者它们已经过时了。我找不到任何可以解释生成函数的方法的教程(尽管我已经找到了生成struct,enum,union等的规范)。

请帮助了解这些规格。

1 个答案:

答案 0 :(得分:3)

通常,从.x文件中生成三个“组”代码:消息xdr编码器/解码器函数,客户端存根和服务器存根(嗯,你也可以手工完成,但要做到这一点太多了)对 )。使用-a选项运行rpcgen也会生成客户端,服务器sthus和示例实现。首先尝试使用一个简单的例子:

program STRLEN {
  version STRLENVERS {
    int strlen(string) = 1;
  } = 1;
} = 117;

规范program是RPCL的一部分,但是XDR语言。如果在 test.x 文件中放置上述规范并使用rpcgen -C test.x运行它,那么他/她就会得到

  

test.h,   test_svc.c,   test_clnt.c

如果一个人不需要任何服务器或客户端存根,只需要XDR的编码器和解码器功能那么 gm_protocol.x 文件中的每个规范,如枚举,结构,联合等,都将是在 gm_protocol.h 中生成等效的基于C的声明,并在 gm_protocol_xdr.c 中生成相应的XDR编码器和解码器函数,这是问题中指定的情况。

运行rpcgen -a gm_protocol.x会生成 gm_protocol_svc.c gm_protocol_clnt.c ,而不会有任何功能。

以下是一些XDR规范:

enter image description here

检查旧的SUN纪录http://www.shrubbery.net/solaris9ab/SUNWdev/ONCDG/toc.html