【发布时间】:2019-04-30 03:07:01
【问题描述】:
我正在运行一个小型 rpc 程序/使用 rpc 框架,该框架从客户端文件中获取 char[] 并将其发送到枚举字符串中的整数的服务器。
我有一个文件client.c,它接受用户输入并将其传递给头文件中的外部函数。
#include <rpc/rpc.h>
#include "getNumInt.h"
int main(int argc, char **argv){
CLIENT *cli;
char *server;
server = argv[1];
cli = clnt_create(server, GETNUMINT, GNUMINT, "tcp"); //creates a client handle
/*does some check for whether the client connected*/
char command[256];
int *numInt;
fgets(command, 256, stdin);
numInt = enumints_1(&command, cli); //segfaults here according to backtrace
return(0);
}
函数enumints_1在我的服务器存根server.c中定义为:
int *enumints_1(msg, req)
char **msg; struct svc_req *req;{
printf(*msg);
static int numDigits = 0;
char msgcopy[256];
strcpy(msgcopy, *msg);
int i = 0;
for(i; i<strlen(msgcopy); i++){
if(msgcopy[i] >= '0' && msgcopy[i] <='9'){
numDigits++;
}
}
return(&numDigits);
}
我的主要问题是我如何遍历char **msg,因为这可能是我的程序出现段错误的原因。
command 只是从用户输入中获取的字符串,然后通过引用传递给 enumints_1 函数。
因为它是一个指向点的指针,所以我认为我可以只使用strcpy 或memcpy 将字符串复制到 char 数组中,但这不起作用。
还有我的.x 文件:
struct intStringPair{
int numInts;
char msg[256];
};
program GETNUMINT{
version GNUMINT{
int ENUMINTS(string) = 1; //string considered char * the rpc generated file makes it so enumints_1 then has to take char **
int WRITEMESSAGE(intStringPair) = 2;
} = 1;
}= 0x20000001;
【问题讨论】:
-
command不是指针。所以&command不是指向指针的指针。 -
哎呀。为什么
enumints_1使用古老的无类型函数接口?普通原型更不容易出错。 -
@Gene 它们是由 rpcgen 从 .x 文件自动生成的。编辑:我误解了,不幸的是,原型是 rpcgen 生成
.h所需要的,这就是enumints_1的来源
标签: c pointers segmentation-fault rpc