我一直在浏览互联网上的几个网站,实际上想知道我们如何在 .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等的规范)。
请帮助了解这些规格。
答案 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规范:
检查旧的SUN纪录http://www.shrubbery.net/solaris9ab/SUNWdev/ONCDG/toc.html