2011-06-30 121 views
3

在C++中,我们使用网络套接字发送数据。我知道,我们需要使用htons()还有ntohs()函数保持字节顺序大端小尾数。我们下面的数据C++在套接字编程中的字节顺序

支持发送

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

这也可以被包装成结构。

我在这里的混乱,对于ID,我们可以使用htons()功能。但对于字符串名称,我们应该怎样做?我们是否需要使用这些功能?它可以在Mac,Intel和其他网络上运行吗?

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

回答

6

你会使用htonlint而不是htons

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

字节顺序的问题仅出现在大于一个字节的字上,因为不同的体系结构选择放置最低有效字节的不同端。

+1

@Vijay:我不知道你在做什么。 –

+0

@marcelo:可能是多字节字符? 0x0001变成0x0100? – Donotalo

+0

马塞洛坎托斯看起来像你是对的。需要一些更多的信息。谢谢 – Vijay

1

对于char数组,这种转换不是必须的,因为它们没有网络字节顺序,但是被顺序发送。存在ntohshtons的原因是,一些数据类型由较小和较重要的位组成,这些位在不同的体系结构上被不同地解释。字符串中不是这种情况。

+0

实际上,对于那些字节排序的问题。 – diverscuba23

+1

你的意思是字符串?不,为什么要这样? – Constantinius

+0

我指的是ntohs和htons及其相关的功能。如果主机字节顺序与网络字节顺序不同,则不要重新排列每个字节中的位,只是交换字节顺序。 – diverscuba23

0

要添加到有用的评论在这里 - 如果你的结构变得更加复杂,你可以考虑一个序列化库,比如Boost.SerializationGoogle Protocol Buffers,它们会在你的封面下处理字节序列。

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