- 主题:Windows和Linux怎样传数据的?
那个网页说的是单机的数据模型,是编译器用的。跟跨系统传数据没关系。
跨系统主要是big endian和little endian的问题,
统一用网络字节序就行了,网络字节序是big endian的。
htons/htonl/ntohs/ntohl这些函数/宏可以转换字节序。
--
FROM 123.115.134.*
你的同一份代码,会在windows和linux上都编译?
还是同一份代码会在linux上同时编译出32和64位的二进制?
针对特定的OS、特定的位宽(32还是64)处理就行,
其他暂时不需要支持的情况,用宏检测了直接报编译错误,等着有需要时再fix。
跨进程、跨机器的接口中的字段,理论上需要是宽度确定的字段,不能是宽度跟着编译器动态变的字段类型。
【 在 confinement 的大作中提到: 】
: 想序列化/反序列化就有关系了呀,传递的字节数就不一样...
:
--
修改:z16166 FROM 123.115.134.*
FROM 123.115.134.*
align/padding不影响。
贴一下结构(因为说了半天,还没明白是啥情况,只能空对空)、序列化后出来的啥幺蛾子。用的自己撸的序列化库?是32还是64的编译?
windows上MSVC的话,32的int、long和64的int、long等都是一样的宽度。
【 在 confinement 的大作中提到: 】
: 都看了,endian 一样,对齐pack(1),就那个long不一样...
:
--
修改:z16166 FROM 123.115.134.*
FROM 123.115.134.*
代码直接传了内存中的整个struct、string出去了?纯外行,要打五十大板
【 在 confinement 的大作中提到: 】
:
: 说的很明白了呀,一个linux系统,一个windows一系统,你可以理解其中一个为数据产生者,产生一个叫做 Foo 的 struct, 另一个为消费者,要拿这个 struct 的数据来用,所以两个机器上的代码不同但是都有同样的 struct,这个struct 就要通过tcp/ip来传输。然后问题就来了,看主贴的链接,里面有一些数据类型它长度不一样,于是两边就不一致了,A说我已经传了一个struct过去了,B说你传的这玩意根本就不是一个struct,大小都对不上!
:
: 而且不只是自己定义的问题,即使都用一样长度的数据类型(比如 char、int),它这些struct在两边看起来,可能还是有些不一样的。还有就是用库的问题,比如库已经定义有 string 类了,然后你去 sizeof(string), 你会看到有的是28, 有的是32, 有的是40..
:
: --
发自「今日水木 on Android」
--
FROM 123.115.134.*