使用rpcgen从远程服务器返回字符串

时间:2014-03-04 07:46:17

标签: rpc xml-rpc

我正在阅读RPC教程,并在rpcgen中学习一些技巧。我有想法使用rpcgen添加,乘以不同的数据类型。

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

任何人都可以建议我如何处理这个问题吗?如果您建议任何有关此返回字符串/指针问题的教程,将会很有帮助。

提前谢谢。

2 个答案:

答案 0 :(得分: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文件中,您可以在程序中定义一个返回类型为my_result的结构的RPC。由于rpcgen将为您提供指向此结构的指针(我称之为res),您可以使用prinf("%s\n", res->data);打印消息。

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

答案 1 :(得分:0)

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

在你的.x文件中,你用里面的字符串定义你的结构,先前已经定义了字符串的大小:

typedef string str_t<255>;

struct my_result {
    str_t data;
};
...

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

$rpcgen -N *file.x*

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

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

.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; 

从那里你就可以明智地使用它了! :)