我希望这个案例能够得到一些帮助。如何从.x文件(内存分配)使用生成的XDR结构
我需要发送一个XDR消息,即它是由2个文件组成(开关的情况下== OK)。
假设我有我的代码message
对象调用response
:
message response;
如果我必须只在消息中发送一个文件,我会做:
response.message_u.fdata.last_mod_time = last_modification;
response.message_u.fdata.contents.contents_len = file_size;
response.message_u.fdata.contents.contents_val = buffer;
随着缓冲剂是:
buffer = malloc(file_size * sizeof(char));
现在,我明白了struct file fdata<2>;
我t是一个可变大小的数组(2是最大长度),我将它们索引为something[0]
和something[1]
。
另外我知道我需要分配内存,但我不知道如何做到这一点在这种情况下与多个文件。
我需要为我需要发送的所有东西做一个单独的malloc吗?事情是这样的:
response.message_u.fdata.fdata_val = malloc ((file_size1 * sizeof(char)) + (file_size2 * sizeof(char)) + (2 * sizeof(uint32_t)));
(2 * sizeof(uint32_t))
:一个last_mod_time为每个文件发送
而其他的问题,我如何引用每个文件结构:
response.message_u.fdata[0] //?
response.message_u.fdata.last_mod_time[0] //?
response.message_u.fdata[0].last_mod_time //?
response.message_u.fdata.contents.contents_len[0] //?
response.message_u.fdata.contents.contents_val[0] //?
的.X文件:
enum tagtype {
GET = 0,
OK = 1,
QUIT = 2,
ERR = 3
};
struct file {
opaque contents<>;
unsigned int last_mod_time;
};
typedef string filename<256>;
union message switch (tagtype tag) {
case GET:
filename filenamedata<2>;
case OK:
struct file fdata<2>;
case QUIT:
void;
case ERR:
void;
};
The types.c(用rpcgen生成):
#include "xdr_types.h"
bool_t
xdr_tagtype (XDR *xdrs, tagtype *objp)
{
register int32_t *buf;
if (!xdr_enum (xdrs, (enum_t *) objp))
return FALSE;
return TRUE;
}
bool_t
xdr_file (XDR *xdrs, file *objp)
{
register int32_t *buf;
if (!xdr_bytes (xdrs, (char **)&objp->contents.contents_val, (u_int *) &objp->contents.contents_len, ~0))
return FALSE;
if (!xdr_u_int (xdrs, &objp->last_mod_time))
return FALSE;
return TRUE;
}
bool_t
xdr_filename (XDR *xdrs, filename *objp)
{
register int32_t *buf;
if (!xdr_string (xdrs, objp, 256))
return FALSE;
return TRUE;
}
bool_t
xdr_message (XDR *xdrs, message *objp)
{
register int32_t *buf;
if (!xdr_tagtype (xdrs, &objp->tag))
return FALSE;
switch (objp->tag) {
case GET:
if (!xdr_array (xdrs, (char **)&objp->message_u.filenamedata.filenamedata_val, (u_int *) &objp->message_u.filenamedata.filenamedata_len, 10,
sizeof (filename), (xdrproc_t) xdr_filename))
return FALSE;
break;
case OK:
if (!xdr_array (xdrs, (char **)&objp->message_u.fdata.fdata_val, (u_int *) &objp->message_u.fdata.fdata_len, 10, sizeof (file), (xdrproc_t) xdr_file))
return FALSE;
break;
case QUIT:
break;
case ERR:
break;
default:
return FALSE;
}
return TRUE;
}
感谢您阅读本文,并试图理解本文。对此,我真的非常感激。
谢谢!
什么问题你有?什么是问题?它只是关于'malloc'的东西吗?还有别的吗?更多的东西? –
@Someprogrammerdude你好,这实际上是关于如何填写回复消息。如何把数据:东西[0] =数据和东西[1] =数据,但我不知道这样做。正如我在帖子中所说的,我只知道如何使用一个而不是2。 – JoannaM
@wildplasser:不,但它是rpcgen为了使用XDR而生成过滤器函数('xdr_typename()')所需的语言正如OP的cleary所说的那样。有关[.x文件请参阅此处](https://stackoverflow.com/a/26625494/8051589)的更多信息。 –