【问题标题】:Byte representation - Network raw data字节表示 - 网络原始数据
【发布时间】:2013-05-09 21:12:58
【问题描述】:

我对以下网络类比有点困惑:

假设我通过将指针传递给 Winsock send() 函数来序列化一个结构(带有整数)。

我的 Intel 机器上的这些 4 字节整数在大端机器上可能以不同的方式表示,并且在另一侧重新创建结构时会被误解。

这是可以理解的,但有一个问题——所以我想知道——如果在两台机器上运行的两个程序都编译为 32 位会怎样?英特尔 AMD 指令集不会像二进制文件那样进行自动转换吗?

如果无法避免 - 我将如何通过网络发送原始数据结构而不会出现此问题?

【问题讨论】:

    标签: c++ networking architecture byte winsock


    【解决方案1】:

    您应该为您的数据选择一种网络格式并指定此格式中的每个字节(例如,您可以对整数使用 big-endian 4 字节表示),然后为您的程序的每种平台写入/从这种格式的转换器运行在。

    32/64 位、指令集、Intel/AMD 差异与此无关。

    【讨论】:

    • 他就是这个意思。
    【解决方案2】:

    看看书Beej's Guide to Network Programming他非常清楚地解释了这个问题及其简单的解决方案。即使他通过更改 API 调用为 UNIX 提供的代码,您也可以在 WinSock 中执行此操作。如果你像我一样懒得阅读,请查看Packing Data

    【讨论】:

      【解决方案3】:

      因为不同架构的机器(不,英特尔和 AMD 没有 [足够] 不同的架构)可能以不同的字节顺序存储数据。由于使用网络的人希望他们的数据以一种可以理解的格式到达,无论是 1990 年的数字设备 VAX、2005 年的 Sun Sparc 还是 1996 年的 AMD 486、2008 年的 iPhone (ARM) 或 2013 年的英特尔 CoreX 机器,网络协议规定顺序应该是某种方式。

      自 1980-1990 年代以来,最常见的机器(至少可能连接到某种网络的机器)恰好是“大端”,这是当时做出的选择,当然,我们现在不能仅仅因为时代变了就改变它,因为这需要撕掉所有依赖于顺序的现有代码。

      当然,如果您只使用您的软件将数据发送到其他机器,那么您可以做任何您想做的事 - 这是您的数据、您的打包方法和您的软件。只要两端对使用哪个顺序有相同的想法。如果您想将数据发送到不是您自己的协议,那么您需要遵循该协议关于字节顺序的规定。

      这真的只是“定制”的问题。我们必须有一个标准,否则我们无法在不同基础架构的机器之间发送数据。就像如果不同的制造商(或型号)根据“他们当时的感觉”将制动踏板放在不同的位置,这将对大多数人的驾驶能力造成严重破坏 - 想象一下必须记住你是否应该踩下你的脚在左,中或右踏板上走得更慢?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多