如何正确初始化作为 ANSI-C 中 RPC 自动生成结构字段的字符串
How to properly initialize a string that is a field of an autogenerated structure from RPC in ANSI-C
我正在 Ubuntu 17.04 中使用 ANSI-C 编写 RPC 客户端-服务器应用程序。在正确初始化使用 RPC 从预定义结构自动生成的字符串并将其从客户端传递到服务器时,我遇到了很大的麻烦。
这是我对结构的定义(在 RPC 中):
struct usuario{
int codigo;
string nombreUsuario<25>;
string nombreReal<25>;
string apellido1<25>;
string apellido2<25>;
string clave<25>;
int num_tarjeta;
string fechaAlta<10>;
string fechaBaja<10>;
};
此处是远程函数定义(在 RPC 中):
program NPROG {
version NVERS {
string registrarse(usuario)=2;
}=1;
}=0x20000001;
注意:我在远程调用之前初始化了所有字段和所有字符串,这些字符串就像我将在下面显示的那样,但我在这里只写一个是为了不写很长问题。
现在我的客户端有这样的东西:
void
nprog_1(char *host)
{
CLIENT *clnt;
char * *result_1;
usuario register_arg;
#ifndef DEBUG
clnt = clnt_create (host, NPROG, NVERS, "tcp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
#endif /* DEBUG */
register_arg.codigo = 0;
// In this way, Segment fault, the two functions, strcpy and strncpy
// strcpy(register_arg.nombreUsuario, "SomeName");
strncpy(register_arg.nombreUsuario, "SomeName", sizeof(register_arg.nombreUsuario));
// call failed en registro: RPC: Remote system error
// register_arg.nombreUsuario = "SomeName";
result_1 = registrarse_1(®ister_arg, clnt);
if (result_1 == (char **) NULL) {
clnt_perror (clnt, "call failed en registro");
}
#ifndef DEBUG
clnt_destroy (clnt);
#endif /* DEBUG */
}
我没有输入 remote/server 代码,因为我什至无法到达那里。
问题是,在为字符串生成的结构中,没有预先分配内存,这些只是悬空指针!所以你必须自己关心字符串的内存,例如你可以传递一个常量:
register_arg.nombreUsuario = "SomeName";
或者自己分配内存:
register_arg.nombreUsuario = strdup("SomeName");
那么它应该会如您所愿地工作。
我正在 Ubuntu 17.04 中使用 ANSI-C 编写 RPC 客户端-服务器应用程序。在正确初始化使用 RPC 从预定义结构自动生成的字符串并将其从客户端传递到服务器时,我遇到了很大的麻烦。
这是我对结构的定义(在 RPC 中):
struct usuario{
int codigo;
string nombreUsuario<25>;
string nombreReal<25>;
string apellido1<25>;
string apellido2<25>;
string clave<25>;
int num_tarjeta;
string fechaAlta<10>;
string fechaBaja<10>;
};
此处是远程函数定义(在 RPC 中):
program NPROG {
version NVERS {
string registrarse(usuario)=2;
}=1;
}=0x20000001;
注意:我在远程调用之前初始化了所有字段和所有字符串,这些字符串就像我将在下面显示的那样,但我在这里只写一个是为了不写很长问题。
现在我的客户端有这样的东西:
void
nprog_1(char *host)
{
CLIENT *clnt;
char * *result_1;
usuario register_arg;
#ifndef DEBUG
clnt = clnt_create (host, NPROG, NVERS, "tcp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
#endif /* DEBUG */
register_arg.codigo = 0;
// In this way, Segment fault, the two functions, strcpy and strncpy
// strcpy(register_arg.nombreUsuario, "SomeName");
strncpy(register_arg.nombreUsuario, "SomeName", sizeof(register_arg.nombreUsuario));
// call failed en registro: RPC: Remote system error
// register_arg.nombreUsuario = "SomeName";
result_1 = registrarse_1(®ister_arg, clnt);
if (result_1 == (char **) NULL) {
clnt_perror (clnt, "call failed en registro");
}
#ifndef DEBUG
clnt_destroy (clnt);
#endif /* DEBUG */
}
我没有输入 remote/server 代码,因为我什至无法到达那里。
问题是,在为字符串生成的结构中,没有预先分配内存,这些只是悬空指针!所以你必须自己关心字符串的内存,例如你可以传递一个常量:
register_arg.nombreUsuario = "SomeName";
或者自己分配内存:
register_arg.nombreUsuario = strdup("SomeName");
那么它应该会如您所愿地工作。