0

我对以下网络类比有点困惑:

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

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

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

如果没有办法避免它 - 我将如何通过网络发送原始数据结构而不会出现这个问题?

4

3 回答 3

0

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

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

于 2013-05-09T12:48:51.510 回答
0

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

由于在 1980-1990 年代,最常见的机器(至少可能连接到某种网络的机器)碰巧是“大端”,这是当时做出的选择,当然,我们可以现在不要仅仅因为时代变了就改变它,因为那将需要撕掉所有依赖于顺序的现有代码。

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

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

于 2013-05-09T13:12:58.987 回答
0

看一下Beej 的网络编程指南,他非常清楚地解释了这个问题及其简单的解决方案。即使他通过更改 API 调用为UNIX提供的代码,您也可以在WinSock中执行此操作。如果您像我一样懒惰阅读,请检查此包装数据

于 2013-05-09T12:53:29.693 回答