【问题标题】:Best and safe way to transfer data over a pipe on different platform在不同平台上通过管道传输数据的最佳和安全方式
【发布时间】:2011-11-11 22:01:12
【问题描述】:

目前我面临一个问题,即我将缓冲区对象通过管道从 x64 拱门传递到 x86 拱门。该对象还包含一些指针值,在 x64 中为 8 个字节,在 x86 上相同的指针大小为 4 个字节。现在,当我通过管道传输对象时,它的大小比 x86 平台对同一对象的期望要大一些(因为这里的指针大小更小)。我可以从这个论坛的类似帖子中了解到我可能需要使用序列化,但我不知道如何使用序列化,因为我以前从未使用过序列化。序列化会解决这个问题吗?我正在使用带有 GCC 编译器的 C++。我希望该产品适用于所有架构(ia64、x64 或 x86)。

【问题讨论】:

  • 我不认为您可以使用 memcpy(&obj, sizeof(obj), data, sizeof(obj)) 之类的东西,然后将数据传输到您执行 memcpy(data, sizeof( obj), &obj, sizeof(obj)),就是错了/

标签: c++ c networking pipe named-pipes


【解决方案1】:

指针是指向本地运行程序中内存位置的地址*。发给别的程序是没用的,对另外一台机器上运行的程序更没用,如果另一台机器的架构不同就更没用了。

在你的上下文中使用序列化意味着发送指针所指向的内容,而不是发送 无意义的指针本身。

要实现跨架构的数据发送,更容易使用文本进行数据传输。大多数(如果不是全部)广泛使用的跨架构协议都使用文本:HTTP、IMAP、IRC ...

*:我使用program 而不是process。

【讨论】:

  • 第一个段落的想法。假设我有两个 m/c 具有限制性计算限制,sys-1 需要进行一些非常复杂的计算,这将导致需要通过的大量对象到 sys-2。如果我有一台超级计算机可以使用,那么 sys-1 可以将参数传递给超级计算机以执行计算,SC 将把该对象存储在它自己的内部,然后将一个指针传递给 sys-1。 Sys-1 会发送一个带有这个指针的对象给 sys-2,如果需要,sys-2 可以向我们的 SC 查询计算结果,SC 将只返回相关字段。这部奇幻电影有意义吗?
  • 这不是幻想。这是非常可能的。这里的问题是您的设计涉及多台计算机。因此,在考虑 pointer 时,您必须考虑类似于 URL 的东西,而不是传统的 C 指针。因此,我可以将您的场景翻译为“sys-1 向 SC 发送计算请求,并告诉 sys-2 结果在 SC 上的位置。然后 sys-2 可以访问结果。”对于这种设计,您绝对必须开箱即用地思考。
【解决方案2】:

http://code.google.com/apis/protocolbuffers/

协议缓冲区是 Google 的语言中立、平台中立、可扩展的结构化数据序列化机制——想想 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地在各种数据流中写入和读取结构化数据,并使用各种语言(Java、C++ 或 Python)。

在 x86/64 上为我工作,arm

【讨论】:

    【解决方案3】:

    boost serialization 专门设计用于:

    在这里,我们使用术语“序列化”来表示可逆 将任意一组 C++ 数据结构解构为 字节序列。这样的系统可用于重构 另一个程序上下文中的等效结构。取决于 上下文,这可能用于实现对象持久性,远程 参数传递或其他设施。在这个系统中,我们使用术语 “存档”是指此字节流的特定呈现。 这可能是二进制数据、文本数据、XML 或其他一些文件 由该库的用户创建。

    顺便说一下,使用 POD 结构,并确保使用特定类型的数据类型。为此使用预定义类型(例如,查看here)

    【讨论】:

    • 好吧,我使用 POD 结构和一些演员来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多