【发布时间】:2018-04-21 22:38:25
【问题描述】:
一旦 XDR 联合由 svc_getargs() RPC 调用填充,我正在尝试将 XDR 联合分配给结构联合。但是,我在执行此操作时收到“类型不兼容”错误。我也试过 memcpy() 但也有同样的问题。下面是我的代码。感谢您的帮助。
struct data_str {
struct svc_req *rqstp;
SVCXPRT *transp;
bool_t retval;
xdrproc_t _xdr_result;
//outputImage get_minified_image_1_res;
//inputImage get_minified_image_1_arg;
union {
inputImage get_minified_image_1_arg;
} argument;
bool_t (*local)(char *, void *, struct svc_req *);
};
static void
minify_image_program_1(struct svc_req *rqstp, register SVCXPRT *transp) {
struct data_str *req_holder;
union {
inputImage get_minified_image_1_arg;
} argument;
union {
outputImage get_minified_image_1_res;
} result;
xdrproc_t _xdr_argument, _xdr_result;
bool_t (*local)(char *, void *, struct svc_req *);
req_holder = malloc(sizeof(*req_holder));
req_holder->rqstp = rqstp;
req_holder->transp = transp;
memset((char *) &argument, 0, sizeof(argument));
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
svcerr_decode(transp);
return;
}
req_holder->_xdr_result = _xdr_result;
req_holder->argument = argument; // THIS IS WHERE I GET THE ERROR
req_holder->local = local;
return;
}
编辑: 更多的上下文。这适用于一个围绕远程过程调用 (RPC) 有两个部分的项目 - 第一个是单线程服务器,第二个是多线程服务器。上面的代码是第二部分,我试图修改 RPC 的自动生成的“svc”,使其具有老板-工人模式的多线程 (MT)。自动生成的文件非常适合单线程部分。但是对于 MT 部分,我需要从 Boss 线程中获取“argument”变量并将其提供给工作线程;然后工作线程从服务器获取所需的数据(缩小的图像)并返回给客户端。
【问题讨论】:
-
为什么工会只有一个成员?
-
你的工会未命名。
-
那个联合是由 rpcgen 生成的。我无法控制它。
-
发布的代码无法编译,原因包括缺少
stdlib.h和string.h头文件。联合缺少“标签”名称,没有原型:svc_getargs()和svcerr_decode() -
@user3629249:那些 cmets 不是很有帮助。我们已经知道问题是什么,我们不需要 MVCE 来诊断或讨论它。这些 cmets 指出的东西并不是完整代码中的实际问题,因为它无疑定义了各种项目并包含必要的标题。