C ++在套接字编程中的字节顺序

时间:2011-06-30 11:44:13

标签: c++ sockets endianness

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

支持我们有以下数据发送

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

这也可以包含在struct中。

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

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

3 个答案:

答案 0 :(得分:6)

您对htonl使用int,而不是htons

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

字节顺序的问题只出现在大于一个字节的字上,因为不同的体系结构选择不同的结束来放置最不重要的字节。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

要在此处添加有用的评论 - 如果您的结构变得更复杂,那么最好考虑使用Boost.SerializationGoogle Protocol Buffers等序列化库,它们可以为您处理字节序。

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