像在 mmo 游戏中那样通过网络将消息打包和解包给 send/receive 他们的最佳方法是什么?

what is the best way to pack and unpack messages to send/receive them trough the network like in a mmo game?

发送信息消息的最佳方式是什么:位置、治疗到服务器然后将它们广播给所有玩家(如何以又好又快的方式 "pack" 和 "unpack" ?)

我有一个管理结构(消息)的消息系统,例如:

struct position{
    long entityId;
    float x;
    float y;
    float z;
};

现在,我需要 "pack" 这个结构(我可以将这个结构更改为任何其他建议)以快速的方式将它们发送到服务器(通过网络),然后 "unpack" 他们在客户端。

我对 mmo 游戏如何做到这一点很感兴趣。

谢谢!

可能使用 FPU 的变量类型可能包含不同的 内存表示 [不仅是字节顺序] 在不同的体系结构上(例如 floatdouble) 如果无法知道两端的体系结构(或者,换句话说, 被授予特定体系结构),则不应在网络传输中使用。

一个float类型的表示可能在一个架构中符合IEEE 754规范,但并不保证每个架构都符合它。始终使用大小众所周知的类型(例如来自 stdint.huint16_tuint32_t 等)并使用 htons() / ntohs() / htonl() / ntohl()(来自 arpa/inet.h)从 主机字节顺序 转换为 网络字节顺序 反之亦然。

您还需要使用编译器扩展来授予对齐(例如 __attribute__ ((align()))#pragma pack())以授予结构对齐在两端相同。

如果您不想[或不能使用]编译器扩展(由于可移植性问题),那么结构不是 [直接] 方法。

在那种情况下,您仍然可以在代码中使用结构,但您应该实现自定义序列化/反序列化例程,以构建要传输的缓冲区(同时考虑主机到网络和网络到主机的字节顺序和永远不要使用 float / double 类型 [FPU] 除非你在序列化例程中涵盖这些转换).

此外,请查看 this question,并阅读 所有 中获得正面投票评级的答案(我只需要补充一点,你应该只在处理网络通信时使用 stdint.h 类型。