c++ - 我应该考虑网络字节顺序吗?

标签 c++ qt tcp network-programming endianness

我无法理解“网络字节序”的概念。我读过Network byte order and endianness issues , 但仍然不能。
现在,我对两台计算机之间通过 TCP 套接字进行的通信进行了正式的网络协议(protocol)描述。这是短语“...使用小端字节序”。但是标准的网络字节顺序是大端。

我是否应该考虑字节顺序,如果在网络的两侧都完全定义了字节顺序,并且我粗略地说,void*size ?网络如何“知道”我的数据? float 类型呢?

比如我这边是否不能写:

stream.setDevice(tcpSocket);
stream.setByteOrder(QDataStream::LittleEndian);
...

struct SomeType
{
    int32_t a;
    int32_t b;
    double c;

    friend QDataStream& operator << (
        QDataStream& stream, const SomeType& x)
    {   
        stream << x.a
            << x.b
            << x.c;

        return stream;
    }        
};

或者可能只是:

SomeType x;
tcpSocket.write(&x, size); // If known a byte order and a data structure alignment on both sides

最佳答案

32 位值表示为小端(intel 等):

地址偏移量 0 1 2 3 位 0-7 位 8-15 位 16-23 位 24-31


并以网络字节顺序或大端(motorola cpus 等)表示:

地址偏移量 0 1 2 3 位 24-31 位 16-23 位 8-15 位 0-7


根据您最初学习编写机器代码的架构(如果您学习过),其中一个对您来说比另一个更有意义。对于几乎所有 45 岁以下的人来说,这将是与网络字节顺序相反的小端字节序。

如果你像我一样学会了在德州 TMS9900 架构上编写机器代码,那就更令人困惑了,因为在德州,第 0 位是最高有效位 (!)


更新:

一般来说,最好以独立于硬件或编译器实现选择甚至语言的方式在线上编码数据。

这是来自谷歌 Protocol Buffer 的此类编码示例:

https://developers.google.com/protocol-buffers/docs/encoding

这里的优点是:

  1. 通常传输的流量较少,因此网络速度较快

  2. 无论硬件、编译器版本,甚至语言如何,连接的每一端都会理解数据。

关于c++ - 我应该考虑网络字节顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46070716/

相关文章:

c++ - DirectX — 是否有 DirectDraw 表面 Flip() 的类似物?

android - 即使焦点设置为 true,后退键导航也不起作用

c++ - 我们可以在构造函数中定义静态类成员吗?

c++ - 如何使Qt生成makefile而不需要qmake依赖

python - 集群 TCP 服务器,因此可以向所有客户端发送数据

c++ - 在过去的十年中,C++ 发生了怎样的变化?

c++ - 在代码块中运行发布版本时出现段错误,但运行调试版本时不会出现段错误

c++ - 模板化链接不适用于 -O2,但适用于 -O0

ios - 在 iOS 中,我们如何增加每个主机的 HTTP 连接限制?

java - EchoServer(Java)不将消息返回给客户端(golang)