2014-10-28 24 views
2

我一直在寻找通过互联网上的多个网站,其实是想知道我们如何在.X写入文件规范中 .C产生同等功能 RPC文件。我参观了每一个网站建议使用以下各种规格的* .X文件:理解XDR规范创建一个* .X文件

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

因此,了解实际,我从被称为神经节的开源项目获得gm_protocol.x和产生等价的C源代码(gm_protocol_xdr.c)和C头文件(gm_protocol.h)使用rpcgen。

[[email protected] rpc]$ rpcgen -C gm_protocol.x 
[[email protected] rpc]$ 
[[email protected] 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规范,因为我咨询了错误的来源或者他们已经过时。我找不到任何可以解释生成函数的方法的教程(虽然我找到了生成结构,枚举,联合等的规范)。

请帮助了解这些规格。

回答

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中的枚举,结构,联合等所有规范都将生成它们等效的基于C的声明在gm_protocol.h及其相应的XDR编码器和解码器功能将在gm_protocol_xdr.c中生成,这是问题中指定的情况。

运行rpcgen -a gm_protocol.x会产生gm_protocol_svc.cgm_protocol_clnt.c没有任何功能。

下面是一些XDR规格:

enter image description here

检查老孙实况http://www.shrubbery.net/solaris9ab/SUNWdev/ONCDG/toc.html

+0

的联系似乎是有用的,但是这并没有回答我的问题。我的问题是** gm_protocol.x **没有像'program STLEN {'一样包含任何规范,但仍然rpcgen可以创建包含函数的gm_protocol_xdr.c **文件。 根据Richard Stevens撰写的“Unix Network Programming Vol 2”: ** RPC规范(RFC 1831)指出,RPC语言(有时称为RPCL)与XDR语言(在RFC 1832中定义)相同,除用于添加程序定义(描述程序,版本和程序)。** 那么,这些函数是如何在这里创建的? – Rohit 2014-10-29 08:47:52

+1

rpcgen将为.x文件中定义的任何结构和枚举生成编码器/解码器函数.XDR编码的消息是一个字节数组,您需要将它们转换为相应的类型。 – kofemann 2014-10-29 08:56:07

+1

这就是我之前想的。所以,这意味着不需要在'**。x **文件中放置'程序STRLEN {'来生成编码器/解码器功能。 +1确认。我会编辑你的答案,并添加完整的答案。谢谢。 – Rohit 2014-10-29 09:31:36