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&lt;20&gt;;.

【讨论】:

【参考方案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-在结构中传递字符串的主要内容,如果未能解决你的问题,请参考以下文章

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

CPP 在 rpcgen 源文件的 %-lines 中扩展宏

从多线程 RPC 服务器返回带有字符串的结构

将 unsigned long long 与 rpcgen 一起使用会产生错误

在 ubuntu 上编译 rpcgen 程序

rpcgen for Linux