【问题标题】:Returning string from a remote server using rpcgen使用 rpcgen 从远程服务器返回字符串
【发布时间】:2014-03-04 07:46:17
【问题描述】:

我正在学习 RPC 教程并学习 rpcgen 中的一些技术。我有使用 rpcgen 来添加、相乘不同数据类型的想法。

但是我还没有找到任何线索来说明如何在 .x 文件中声明一个返回字符串的函数。实际上我正在尝试构建一个返回随机字符串的程序(rand 字符串数组在服务器中)。

谁能告诉我如何处理这个问题?如果您向我提供有关此返回字符串/指针问题的任何教程,将会很有帮助。

提前谢谢你。

【问题讨论】:

    标签: rpc xml-rpc


    【解决方案1】:

    根据XDR protocol specification,你可以定义一个字符串类型,其中m是字符串的长度,以字节为单位:

    该标准将 n(编号为 0 到 n -1)字节的字符串定义为编码为无符号整数的数字 n(如上所述),然后是字符串的 n 个字节。实现必须将每个字节视为 8 位透明数据。这允许使用任意字符集编码。字符串的字节 m 总是在字符串的字节 m +1 之前,而字符串的字节 0 总是在字符串的长度之后。如果 n 不是 4 的倍数,则 n 个字节后跟足够的(0 到 3)个剩余零字节 r,以使总字节数成为 4 的倍数。

    string object<m>;
    

    然后您可以定义一个字符串类型为str_t 的结构体作为变量之一:

    typedef string str_t<255>;
    
    struct my_result {
        str_t data;
    };
    

    然后在您的 .x 文件中,您可以在程序中定义一个 RPC,它返回一个类型为 my_result 的结构。由于 rpcgen 会给你一个指向这个结构(我称之为 res)的指针,你可以用prinf("%s\n", res-&gt;data); 打印消息。

    program HELLO_PROG {
        version HELLO_VERSION {
            my_result abc() = 1;
        } = 1;
    } = 1000;
    

    【讨论】:

      【解决方案2】:

      好的,回答原题(2岁多),第一个答案是正确的,但有点棘手。

      在您的 .x 文件中,您使用内部字符串定义结构,之前已定义字符串的大小:

      typedef string str_t<255>;
      
      struct my_result {
          str_t data;
      };
      ...
      

      然后在 .x 文件上调用 rpcgen 以生成客户端和服务器存根以及 .xdr 文件:

      $rpcgen -N *file.x*
      

      现在,除了您假装使用远程功能的任何程序外,您还可以编译客户端和服务器。为此,我遵循了 ORACLE 网页中的“repcgen 教程”: https://docs.oracle.com/cd/E19683-01/816-1435/rpcgenpguide-21470/index.html

      棘手的部分是,尽管您定义了一个大小为 m 的字符串(m 个字符的数组),但 rpcgen 和 .xdr 文件创建的是一个指向已分配内存的指针。像这样的:

      .h 文件

      typedef char *str_t;                                                                                                                        
      
      struct my_result {                                                              
          int res;                                                                    
          str_t data;                                                                 
      };                                                                              
      typedef struct my_result my_result;
      

      .xdr 文件

      bool_t xdr_str_t (XDR *xdrs, str_t *objp)                                              
      {                                                                               
          register int32_t *buf;                                                      
      
           if (!xdr_string (xdrs, objp, 255))                                         
               return FALSE;                                                          
          return TRUE;                                                                
      }
      

      因此,在您的服务器端使用此结构时,请注意它不是大小为 m 的字符串,而是一个 char 指针,您必须在使用它之前为其保留内存,否则您会收到相同的提示执行时比我错误:

      Segmentation fault!
      

      要在服务器上使用它,您可以编写:

      static my_result response;                                                 
      static char text[255];                                                      
      
      memset(&response, '\0', sizeof(my_result));                                
      memset(text, '\0', sizeof(text));                                           
      
      response.data = text; 
      

      然后您就可以明智地使用它了! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 2023-03-09
        • 2019-04-03
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        相关资源
        最近更新 更多