【问题标题】:C++ Byte order in socket programming套接字编程中的 C++ 字节顺序
【发布时间】:2011-09-25 22:12:57
【问题描述】:

在 C++ 中,我们使用网络上的套接字发送数据。我知道我们需要使用 htons()ntohs() 函数来维护字节顺序 big endianlittle endian。

支持我们有以下数据要发送

int roll;
int id;
char name[100];

这也可以包装到结构中。

我的困惑是,对于 rollid,我们可以使用 htons() 函数。但是对于字符串name,我们应该怎么做呢?我们需要使用任何这样的功能吗?它可以在 mac、intel 和其他网络等每台机器上运行吗?

我想在一个数据包中发送所有三个字段。

【问题讨论】:

    标签: c++ sockets endianness


    【解决方案1】:

    您可以将htonl 用于int,而不是htons

    名称不需要重新排序,因为数组的字节直接对应于网络上的字节。

    字节顺序问题只出现在大于一个字节的单词中,因为不同的架构选择不同的末端来放置最低有效字节。

    【讨论】:

    • @marcelo:可能是多字节字符? 0x0001 变成 0x0100?
    • Marcelo Cantos 看起来你是对的。需要更多信息。谢谢
    • @Vijay:除了最奇怪的平台外,char 的大小与字节相同:八位。当您说“多字节”时,我假设您指的是宽字符或wchar_t,通常是 16 位,但有时是 32 位。无论哪种方式,假设char 将在任何基于IP 的传输上作为一个单元进行编码是非常安全的。如果要发送 Unicode,通常最好发送 UTF-8 编码而不是宽字符。
    • @Marcelo Cantos - 你又是对的。但让我感到困惑。如果我没有转换就发送宽字符,它们会起作用吗? utf8 本身就像 char 数组,所以它可以工作。现在让我感到困惑
    • 宽字符大于一个字节,因此如果您希望传输格式为字节顺序中性,则需要对它们进行字节顺序校正 (htons)。正如您所指出的,UTF-8 编码定义了字符级编码(字节数组),所以它没有这样的问题。
    【解决方案2】:

    对于 char 数组,这种转换不是必需的,因为它们没有网络字节顺序,而是按顺序传输的。 ntohshtons 存在的原因是某些数据类型由较低和较高的位组成,它们在不同的体系结构上的解释不同。字符串中不是这种情况。

    【讨论】:

    • 实际上,对于那些它的字节顺序是问题。
    • 你是说字符串?不,为什么会这样?
    • 我指的是 ntohs 和 htons 及其相关函数。不对每个字节中的位进行任何重新排列,如果主机字节顺序与网络字节顺序不同,则仅交换字节顺序。
    • @diverscuba23:你不需要关心位性,因为你可以使用的最小单位是一个字节。位性只在硬件中很重要。
    【解决方案3】:

    在这里添加有用的 cmets - 如果您的结构变得更加复杂,您最好考虑使用像 Boost.SerializationGoogle Protocol Buffers 这样的序列化库,它们会在后台为您处理字节序。

    在对字符串进行编码时,请确保在字符串本身之前发送一个长度(可能是使用htons 处理的short),不要每次只发送 100 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-30
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多