Я пытаюсь передать строку как часть структуры через сеть, используя пакеты 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);
}
Любая помощь будет оценена.
Из руководства по программированию rpcgen, 6.9. Особые случаи:
Строки: C не имеет встроенного строкового типа, но вместо этого использует соглашение с символом char *. На языке XDR строки объявляются с использованием ключевого слова "строка" и скомпилированы в "char *" в выходном файле заголовка. Максимальный размер, содержащийся в угловых скобках, указывает максимальное количество символов, разрешенных в строках (не считая символа NULL). Максимальный размер может быть остановлен, указав строку произвольной длины.
Примеры:
string name<32>; --> char *name; string longname<>; --> char *longname;
Итак, вы должны объявить name
как указано выше, например, string name<20>;
,
C++ism
о котором я не знаю, ноc=argv[2]
после того, как вы уже присвоилиc = new char[20]
, кажется неправильным ...