2

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

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

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

[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 规范,因为要么我查阅了错误的来源,要么它们已经过时了。我找不到任何可以解释生成函数的方法的教程(尽管我找到了生成结构、枚举、联合等的规范)。

请帮助学习这些规范。

4

1 回答 1

3

通常,从 .x 文件中,您会生成三个“组”代码:消息 xdr 编码器/解码器函数、客户端存根和服务器存根(当然,您也可以手动完成,但要正确完成工作量太大)。使用 -a 选项运行 rpcgen 也可以生成客户端、服务器端和示例实现。首先尝试使用一个简单的示例:

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 中它们等效的基于 C 的声明中。 h及其相应的 XDR 编码器和解码器函数将在gm_protocol_xdr.c中生成,这是问题中指定的情况。

运行rpcgen -a gm_protocol.x会生成没有任何函数的gm_protocol_svc.cgm_protocol_clnt.c 。

以下是一些 XDR 规格:

在此处输入图像描述

查看旧的 SUN 文档http://www.shrubbery.net/solaris9ab/SUNWdev/ONCDG/toc.html

于 2014-10-29T08:14:12.230 回答