我正在阅读RPC教程,并在rpcgen中学习一些技巧。我有想法使用rpcgen添加,乘以不同的数据类型。
但是我没有找到任何线索,我怎么能在.x文件中声明一个函数,它将返回一个字符串。实际上我正在尝试构建一个返回随机字符串的过程(rand字符串数组在服务器中)。
任何人都可以建议我如何处理这个问题吗?如果您建议任何有关此返回字符串/指针问题的教程,将会很有帮助。
提前谢谢。
答案 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;
从那里你就可以明智地使用它了! :)