【问题标题】:Encode and send an XDR struct over a TCP socket (C - Linux)通过 TCP 套接字编码和发送 XDR 结构 (C - Linux)
【发布时间】:2013-11-08 23:23:43
【问题描述】:

我必须问以下问题:

我必须发送以下 XDR 消息:

struct Responde{
 float numbers<>;
 bool end;
}

我知道如何对数组 (xdr_array) 和布尔 (xdr_bool) 进行编码,但我该怎么做:

1) 对结构进行编码? 2) 通过套接字发送结构?

谢谢大家,但我不知道 XDR,我必须使用它。再次感谢。

N.b.:标题如何显示我指的是 C 语言和 Linux 环境。

【问题讨论】:

  • 请问&lt;&gt; 是什么?
  • 表示这是一个变长数组,上面最多有2^32-1个元素
  • 您可能想在这里阅读:docs.oracle.com/cd/E19683-01/816-1435/6m7rrfn7f/index.html(向下滚动到“传递复杂数据结构”)
  • &lt;&gt;不是 C。在 C 中它将是 [],并且只允许用于 strcut 中的最后一个成员。

标签: c linux sockets xdr


【解决方案1】:

最灵活的解决方案当然是使用rpcgen 工具将 XDR 定义编译为 C 代码,然后您可以在 C 应用程序中编译和使用这些代码。但是如果你不想在你的项目中引入这个依赖,你当然可以手动编写序列化代码。

RFC 1831 将为您详细说明此类结构是如何序列化的,但以下是您的示例需要了解的内容:

  • XDR 中的所有数字均按大端顺序编码。
  • 结构中的所有字段都对齐到 4 个字节,并且字段按照声明的顺序连接。
  • float 将数字编码为 32 位浮点数。
  • 可变长度的浮点数数组被编码为一个 32 位整数,其中包含元素数,后跟浮点数。
  • bool 将布尔值编码为 32 位整数,其中真值编码为数字 1,假值编码为数字 0

例如,如果您的结构填充了 3 个浮点数并且值为 true,您将获得以下字节流:

00 00 00 03  xx xx xx xx  yy yy yy yy  zz zz zz zz  00 00 00 01

其中xyz的序列是浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 2017-04-24
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2016-06-06
    相关资源
    最近更新 更多