rpcgen-передача строки внутри структуры

0

Я пытаюсь передать строку как часть структуры через сеть, используя пакеты 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;

Так или иначе, строка усекается до одного символа на сервере. Например, если я передаю имя = "abc", я получаю "а" на сервере. Похоже, что это происходит из-за какой-то проблемы внутри заглушек, но я не могу понять, где ошибка.

Мой клиентский код для функции, которая передает строку в качестве аргумента:

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);
}

Любая помощь будет оценена.

  • 0
    Это может быть C++ism о котором я не знаю, но c=argv[2] после того, как вы уже присвоили c = new char[20] , кажется неправильным ...
  • 0
    На самом деле, я сам не был уверен в этом. Я пробовал разные вещи, чтобы увидеть, смогу ли я найти причину этой проблемы.
Теги:
rpc

1 ответ

1

Из руководства по программированию rpcgen, 6.9. Особые случаи:

Строки: C не имеет встроенного строкового типа, но вместо этого использует соглашение с символом char *. На языке XDR строки объявляются с использованием ключевого слова "строка" и скомпилированы в "char *" в выходном файле заголовка. Максимальный размер, содержащийся в угловых скобках, указывает максимальное количество символов, разрешенных в строках (не считая символа NULL). Максимальный размер может быть остановлен, указав строку произвольной длины.

Примеры:

string name<32>;   --> char *name;
string longname<>; --> char *longname;

Итак, вы должны объявить name как указано выше, например, string name<20>; ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню