字节表示 - 网络原始数据

时间:2013-05-09 12:41:42

标签: c++ networking architecture byte winsock

我对以下网络类比感到有些困惑:

考虑我通过将指针传递给Winsock send()函数来序列化一个结构(带有整数)。

我的Intel机器上的这些4字节整数可能在大端机器上以不同的方式表示,并且在另一侧重新构建结构时会被误解。

这是可以理解的,但是一个问题 - 所以我想知道 - 如果在两台机器上运行的两个程序都被编译为32位怎么办?不会发生自动转换,因为英特尔< - > AMD指令集就像二进制文件一样?

如果没有办法避免它 - 我如何处理通过网络发送原始数据结构而没有这个问题呢?

3 个答案:

答案 0 :(得分:0)

您应该为您的数据选择网络格式并指定此格式的每个字节(例如,您可以使用big-endian 4字节表示整数),然后为您的程序的每种平台写入/从此格式转换器跑来跑去。

32/64位指令集,Intel / AMD差异与此无关。

答案 1 :(得分:0)

看看书Beej's Guide to Network Programming他非常清楚地解释了这个问题及其简单的解决方案。即使他通过更改API调用为 UNIX 提供的代码,您也可以在 WinSock 中执行此操作。如果你像我一样懒得阅读,请查看Packing Data

答案 2 :(得分:0)

因为不同架构的机器(不,Intel和AMD没有[足够]不同的架构)可能会以不同的字节顺序存储数据。由于使用网络的人希望他们的数据以一种可以理解的格式到达,无论是1990年的数字设备VAX,2005年的Sun Sparc还是1996年的AMD 486,2008年的iPhone(ARM)或2013年的英特尔CoreX机器,网络协议规定订单应该以某种方式。

自1980 - 1990年以来,最常见的机器(那些可能与某种网络相连的机器)恰好是“大端”,这是当时的选择,当然,我们现在无法改变它只是因为时间已经改变,因为这需要剥离依赖于订单的所有现有代码。

当然,如果你只使用你的软件将数据发送到其他机器,那么你可以做你喜欢的事情 - 这是你的数据,包装方法和你的软件。只要两端对使用哪个订单有相同的想法。如果要将数据发送到不属于您自己的协议,则需要遵循该协议关于字节顺序的说明。

这真的只是“习惯”的问题。我们必须有一个标准,否则我们不能在不同基础架构的机器之间发送数据。就像它会对大多数人驾驶汽车的能力造成严重破坏,如果不同的制造商(或模型)根据“他们当时的感觉”将刹车踏板放在不同的地方 - 想象一下你是否应该记住你的脚在左,中,右踏板上走得更慢?