在C ++中,我们使用网络上的套接字发送数据。我知道我们需要使用 htons(), ntohs()函数来维护字节顺序 big endian 和 little endian < / strong>即可。
支持我们有以下数据发送
int roll;
int id;
char name[100];
这也可以包含在struct中。
我的困惑是,对于 roll 和 id ,我们可以使用 htons()函数。但是对于字符串 name ,我们该怎么做以及应该怎么做呢?我们需要使用任何这样的功能吗?它会在mac,intel和其他网络的每台机器上运行吗?
我想在一个数据包中发送所有三个字段。
答案 0 :(得分:6)
您对htonl
使用int
,而不是htons
。
该名称不需要重新排序,因为数组的字节直接对应于网络上的字节。
字节顺序的问题只出现在大于一个字节的字上,因为不同的体系结构选择不同的结束来放置最不重要的字节。
答案 1 :(得分:1)
对于char数组,此转换不是必需的,因为它们没有网络字节顺序,而是按顺序传输。 ntohs
和htons
存在的原因是某些数据类型由较小和较重要的位组成,这些位在不同的体系结构上有不同的解释。字符串不是这种情况。
答案 2 :(得分:0)
要在此处添加有用的评论 - 如果您的结构变得更复杂,那么最好考虑使用Boost.Serialization或Google Protocol Buffers等序列化库,它们可以为您处理字节序。
对字符串进行编码时,请确保在字符串本身之前发送一个长度(可能是使用short
处理的htons
),而不是每次只发送100个字符。