rpcgen-在结构中传递字符串
Posted
技术标签:
【中文标题】rpcgen-在结构中传递字符串【英文标题】:rpcgen-passing a string inside a struct 【发布时间】:2014-03-24 03:34:36 【问题描述】:我正在尝试使用 rpcgen 包通过网络将字符串作为结构的一部分传递。这是我的 IDL 代码:
struct param
char* name;
int voterid;
;
program VOTECLIENT_PROG
version VOTECLIENT_VERS
string ZEROIZE() = 1;
string ADDVOTER(int) = 2;
string VOTEFOR(param) = 3;
string LISTCANDIDATES() = 4;
int VOTECOUNT(string) = 5;
= 1;
= 0x2345111;
不知何故,字符串在服务器上被截断为单个字符。例如,如果我通过 name = "abc",我会在服务器上得到 "a"。看起来这是由于存根内部的一些问题而发生的,但我似乎无法弄清楚错误在哪里。
将字符串作为参数传递的函数的客户端代码:
void
voteclient_prog_1(char *host, char* c, int id)
CLIENT *clnt;
char * *result_3;
param votefor_1_arg;
#ifndef DEBUG
clnt = clnt_create (host, VOTECLIENT_PROG, VOTECLIENT_VERS, "udp");
if (clnt == NULL)
clnt_pcreateerror (host);
exit (1);
#endif /* DEBUG */
votefor_1_arg.name = c;
votefor_1_arg.voterid = id;
result_3 = votefor_1(&votefor_1_arg, clnt);
if (result_3 == (char **) NULL)
clnt_perror (clnt, "call failed");
clnt_perror (clnt, "call failed");
#ifndef DEBUG
clnt_destroy (clnt);
#endif /* DEBUG */
int
main (int argc, char *argv[])
char *host;
int id;
char* c = new char[20];
if (argc < 4)
printf ("usage: %s server_host name voterid\n", argv[0]);
exit (1);
host = argv[1];
c = argv[2];
id = atoi(argv[3]);
voteclient_prog_1 (host, c, id);
exit (0);
任何帮助将不胜感激。
【问题讨论】:
这可能是一个我不知道的C++ism
,但是在你已经分配c = new char[20]
之后c=argv[2]
似乎不对...
实际上,我自己也不确定。我正在尝试不同的方法,看看是否能找到导致此问题的原因。
【参考方案1】:
来自rpcgen Programming Guide,6.9。特殊情况:
字符串: C 没有内置的字符串类型,而是使用 以 null 结尾的“char *”约定。在 XDR 语言中,字符串是 使用“string”关键字声明,并编译成“char *” 输出头文件。角度中包含的最大尺寸 括号指定允许的最大字符数 字符串(不包括 NULL 字符)。最大尺寸可能是 left off,表示任意长度的字符串。
例子:
string name<32>; --> char *name; string longname<>; --> char *longname;
所以,你应该像上面一样声明name
,例如。 G。 string name<20>;
.
【讨论】:
【参考方案2】:在上面的注释中补充一点,这种数组在rpcgen中的用法如下:
在你的结构中声明数组(任何类型)像这样
struct myStruct
//In my case I used an array of floats
float nums<>;
这声明了一个浮点类型的“数组”。这种结构有两个变量成员
struct
u_int nums_len;
float *nums_val;
nums;
现在你可以为浮点类型的数组分配内存了:
//totNums is the number of elements in the array
nums.nums_val = (float*)malloc(totNums*sizeof(float));
nums.nums_len = totNums;
现在在服务器中,您可以将数组与所有元素一起使用。
【讨论】:
以上是关于rpcgen-在结构中传递字符串的主要内容,如果未能解决你的问题,请参考以下文章
CPP 在 rpcgen 源文件的 %-lines 中扩展宏