gpt4 book ai didi

c++ - 在 C++ 中创建和使用跨平台结构

转载 作者:可可西里 更新时间:2023-11-01 18:16:35 28 4
gpt4 key购买 nike

我正在编写一个具有网络功能的跨平台游戏(使用 SFML 和 RakNet ),我已经到了在我的 Ubuntu 服务器上编译服务器并在我的 Mac 上运行客户端的地步。所有开发都是在我的 Mac 上完成的,所以我最初是在我的 Mac 上测试服务器,它运行良好。

我正在通过网络发送 struct,然后简单地将它们从 char * 转换回(例如)inet::PlayerAdded .现在这一直工作正常(大部分情况下),但我的问题是:这会一直有效吗?这似乎是一种非常脆弱的方法。即使在其他平台(例如 Windows)上,结构的布局是否始终相同?你会推荐什么?

#pragma pack(push, 1)
struct Player
{
int dir[2];
int left;
float depth;
float elevation;
float velocity[2];
char character[50];
char username[50];
};

// I have been added to the game and my ID is back
struct PlayerAdded: Packet
{
id_type id;
Player player;
};
#pragma pack(pop)

最佳答案

如果(除其他事项外)您尝试从小端机器到大端机器执行此操作,则这将不起作用,因为正确的 int 表示将在两者之间颠倒。

如果您的结构的排列或包装因机器而异,这也可能会失败。如果您有一些 64 位机器和一些 32 位机器怎么办?

您需要使用适当的可移植序列化库,例如 Boost.SerializationGoogle Protocol Buffers确保您拥有可以独立于硬件成功解码的有线协议(protocol)(也称为可传输数据格式)。

Protocol Buffers 的一个优点是您可以使用与 protobuf 流兼容的 ZLIB 兼容流透明地压缩数据。我实际上已经这样做了,效果很好。我想可以以类似的方式使用其他装饰器流来根据需要增强或优化您的基本线路协议(protocol)。

关于c++ - 在 C++ 中创建和使用跨平台结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216639/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com