转自:http://blog.chinaunix.net/space.php?uid=20644632&do=blog&id=2220585
Linux下面的RPC模型是SUN RPC (ONC RPC),使用了XDR来编码/解码数据。gcc提供了一些标准数据类型的XDR filter(比如整型,浮点型,字符串等)。对于自定义数据类型,则需要自己编写XDR filter来处理。
你可以使用rpcgen来帮你自动生成xdr filter,但是,该工具需要你提供一个 .x 文件。我在实际使用的过程中,遇到了一些问题,解决问题的过程中有了一些体会。
(1) xdr_string 无法处理C++的string类型,XDR里面的string都是C style的,这点需要注意。
(2) 在C里面,指针可以用来访问数组,但是,在XDR中则不能简单的混为一谈。比如:
有一个数据结构st:
- struct st {
- int a;
- int b;
- };
- struct xxx {
- struct st *buf;
- int c;
- };
通过rpcgen生成的 XDR filter 中使用 xdr_pointer,xxx.buf 只能传递一个struct st。如果想要传递一个 struct st 数组,则需要使用 xdr_array(可变size的数组)或 xdr_vector (固定size的数组,与 C++ 标准库里面的vector不是一个概念!),.x文件的写法有些不一样!
(3) 我曾经遇到了一个问题,XDR filter 直接返回失败!通过clnt_perrno得到的错误信息是:Can't encode arguments! 花了很多时间才发现,是因为给数据结构里面的一个string(char *)类型的成员传递了空值,导致xdr_string总是失败!