- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望获得有关此案的帮助。
我需要发送一条 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>;
它是一个可变大小的数组(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;
};
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;
}
感谢您阅读本文并尝试理解这一点。我真的很感激。
谢谢!
最佳答案
要回答这个问题,看一下类型会更容易:tagtype
、file
、filename
和 message
rpcgen 从您的 .x 文件生成。它们位于您的 xdr_types.h
中,您没有将其包含在您的问题中,因此我将 rpcgen 与您的 .x 文件一起使用。重要的是文件
和消息
:
...
struct file {
struct {
u_int contents_len;
char *contents_val;
} contents;
u_int last_mod_time;
};
typedef struct file file;
typedef char *filename;
struct message {
tagtype tag;
union {
struct {
u_int filenamedata_len;
filename *filenamedata_val;
} filenamedata;
struct {
u_int fdata_len;
struct file *fdata_val;
} fdata;
} message_u;
};
typedef struct message message;
...
回答您的 2 个问题:
If I had to only send one file in a message, I would do:
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;With buffer being:
buffer = malloc(file_size * sizeof(char));
和
And the other question how to I refer to each file structure:
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] //?
不,response.message_u.fdata.
之后的部分是错误的。它可以是:
response.message_u.fdata.fdata_len
或
response.message_u.fdata.fdata_val
你指的是第二个变体,即struct file *fdata_val;
。对于这部分,您必须分配内存。
以下示例适用于 2 个文件,它也将回答您有关如何引用数据的问题:
// Set variables and allocate space for 2 file structures
message response;
u_int no_files = 2;
u_int file_size = 1024;
u_int last_mod_time = 42;
response.message_u.fdata.fdata_len = no_files;
response.message_u.fdata.fdata_val = malloc(no_files * sizeof(struct file));
// Access 1st file and allocate space for file content
response.message_u.fdata.fdata_val[0].last_mod_time = last_modification;
response.message_u.fdata.fdata_val[0].contents.contents_len = file_size;
response.message_u.fdata.fdata_val[0].contents.contents_val = malloc(file_size * sizeof(char));
// Access 2nd file and allocate space for file content
response.message_u.fdata.fdata_val[1].last_mod_time = last_modification;
response.message_u.fdata.fdata_val[1].contents.contents_len = file_size;
response.message_u.fdata.fdata_val[1].contents.contents_val = malloc(file_size * sizeof(char));
<小时/>
要了解有关 XDR 规范语言和生成的 C 输出之间关系的更多信息,请参阅 SO 上的答案:Understanding XDR specification to create a *.x file很有帮助。
另外还有一本好书Power Programming with RPC by John Bloomer ,它已经很老了(1991 年),但远程过程调用协议(protocol)也是如此。本书介绍的是使用 XDR 发送/接收数据的 RPC 协议(protocol)。该书中对 XDR 语言(使用 rpcgen、过滤器函数等)进行了很好的描述。
Below are some XDR specifications:
关于c - 如何使用从 .x 文件生成的 XDR 结构(内存分配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46073563/
我已经使用 rpcgen 创建了这两个文件(.h 和 .c)以及我自己的两个结构(环境是 Linux,编程语言是 C)。 这两个结构如下(这是 .h 文件): /* * Please do not
我正在通过 XDR 序列化数据包,但我不明白如何提供字符串 vector 。我这里有一个小型的完全可用的序列化/反序列化,用于 std::vector的 uint64_t .这是我的代码: 序列化器:
我正在尝试使用通过 XDR 在结构内部声明的数组从文件发送数据 block 。这个想法是建立一个使用 XDR 编码的客户端服务器通信。 struck response{ float data[5];
我有一个接收 XDR 数据的 C 套接字服务器。我写了一个 C 和一个 Java 客户端。我正在尝试使用 xdrlib 编写 Python 客户端。 import xdrlib p = xdrlib.
所以我有一些代码可以获取一个 json 文件,然后将其传递到引导页面,从而启动我的应用程序 所以我有一个函数可以获取文件并返回回调 function makeCorsRequest(method, u
我正在研究在 Linux 上使用 RPC(远程过程调用)在同一服务器上的两个进程之间进行通信的想法。因此多字节变量的数据格式将是相同的,实际上不需要使用 XDR 进行转换。是否可以在 Linux 上使
我有这个来自线路的 RPC 结构 T_Struct。我想复制它,但我不想编写一个单独的函数来处理其成员的所有结构、分配和数组(尤其是我必须对其他结构的音调做同样的事情。 ) 既然我已经有了一种解码、编
我一定是输入了错误的命令,因为现在我的一个目录中有名为 --exclude=.xdr 和 --exclude=.h5 的文件。我想删除它们。唯一的问题是每当我做类似的事情时: rm --exclude
我使用的是 Ubuntu 10.4,有两个(长)C 程序,一个使用 XDR 写入文件,另一个使用该文件作为输入。然而,第二个程序无法读取写入的文件。一切看起来都很好,但就是行不通。更具体地说,它在此处
我有一些通过 TCP 套接字发送的 XDR 数据包。这是我的代码片段: const size_t BUFFER_LENGTH = 2000; XDR xdr; char *buffer = new c
我们正在对 google maps geocode API 进行跨域调用。这在现代浏览器中过去和现在都工作得很好,但在 IE8 中根本不起作用。看起来它在 IE9 中也会失败(部分 CORS 支持)。
我使用 docx4j 进行 Excel 实现。 通过使用代码,我绘制了文本框架,然后绘制了表格,然后再次绘制了文本框架。 我使用 xdr:absoluteAnchor 而不是 xdr:twoCellA
我正在使用 ember 1.5 使用 grunt-cli 并希望使用 dataType: "JSON" 进行 CORS 支持的 ajax 调用。 Ember.$.ajax({ type: "G
我希望获得有关此案的帮助。 我需要发送一条 XDR 消息,它由2 个文件组成(切换大小写 == OK)。 假设我的代码中有 message名为 response 的对象: message respon
我从 iframe 发出 ajax 请求,该 iframe 通过 IE 插件注入(inject)到每个页面。我正在使用 IE 的 cross domain request因为 jQuery 的 aja
在我的应用程序中,我们使用 XDR 对象(IE8 到 IE10 的 XDomainRequest 和其他浏览器的 EventSource)打开到服务器的粘性连接。 但是,IE11 不再实现 XDoma
我必须问以下问题: 我必须发送以下 XDR 消息: struct Responde{ float numbers<>; bool end; } 我知道如何编码数组(xdr_array)和 bool
我正在编写一个通过套接字发送 XDR 结构的服务器。使用 Wireshark,我看到我的客户端正确地向服务器发送了一条 XDR 消息,但我没有看到任何数据从服务器发送到客户端。但是代码似乎是正确的,因
我正在编写一个程序,该程序使 RPC 打印一条消息,该消息作为参数发送到远程函数。远程函数不应返回任何内容,但出于好奇,我将远程函数设计为返回整数。 无论如何,一切正常,我能够远程打印消息。现在我正在
我想使用 POST 方法在 XDR 中发送 JSON 数据。我能够发送 JSON 数据,但问题是 . (DOT) 符号被转换为 _(下划线)。这是代码: if ($.browser.msie && w
我是一名优秀的程序员,十分优秀!