转自: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:

  1. struct st {
  2.     int a;
  3.     int b;
  4. };
  5. struct xxx {
  6.     struct st *buf;
  7.     int c;
  8. };

通过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总是失败!

posted on 2011-12-16 15:55  吃吃户  阅读(3316)  评论(0编辑  收藏  举报