像在 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 的变量类型可能包含不同的 内存表示 [不仅是字节顺序] 在不同的体系结构上(例如 float
和 double
) 如果无法知道两端的体系结构(或者,换句话说,不 被授予特定体系结构),则不应在网络传输中使用。
一个float
类型的表示可能在一个架构中符合IEEE 754规范,但并不保证每个架构都符合它。始终使用大小众所周知的类型(例如来自 stdint.h
的 uint16_t
、uint32_t
等)并使用 htons()
/ ntohs()
/ htonl()
/ ntohl()
(来自 arpa/inet.h
)从 主机字节顺序 转换为 网络字节顺序 反之亦然。
您还需要使用编译器扩展来授予对齐(例如 __attribute__ ((align()))
或 #pragma pack()
)以授予结构对齐在两端相同。
如果您不想[或不能使用]编译器扩展(由于可移植性问题),那么结构不是 [直接] 方法。
在那种情况下,您仍然可以在代码中使用结构,但您应该实现自定义序列化/反序列化例程,以构建要传输的缓冲区(同时考虑主机到网络和网络到主机的字节顺序和永远不要使用 float
/ double
类型 [FPU] 除非你在序列化例程中涵盖这些转换).
此外,请查看 this question,并阅读 所有 中获得正面投票评级的答案(我只需要补充一点,你应该只在处理网络通信时使用 stdint.h
类型。
发送信息消息的最佳方式是什么:位置、治疗到服务器然后将它们广播给所有玩家(如何以又好又快的方式 "pack" 和 "unpack" ?)
我有一个管理结构(消息)的消息系统,例如:
struct position{
long entityId;
float x;
float y;
float z;
};
现在,我需要 "pack" 这个结构(我可以将这个结构更改为任何其他建议)以快速的方式将它们发送到服务器(通过网络),然后 "unpack" 他们在客户端。
我对 mmo 游戏如何做到这一点很感兴趣。
谢谢!
可能使用 FPU 的变量类型可能包含不同的 内存表示 [不仅是字节顺序] 在不同的体系结构上(例如 float
和 double
) 如果无法知道两端的体系结构(或者,换句话说,不 被授予特定体系结构),则不应在网络传输中使用。
一个float
类型的表示可能在一个架构中符合IEEE 754规范,但并不保证每个架构都符合它。始终使用大小众所周知的类型(例如来自 stdint.h
的 uint16_t
、uint32_t
等)并使用 htons()
/ ntohs()
/ htonl()
/ ntohl()
(来自 arpa/inet.h
)从 主机字节顺序 转换为 网络字节顺序 反之亦然。
您还需要使用编译器扩展来授予对齐(例如 __attribute__ ((align()))
或 #pragma pack()
)以授予结构对齐在两端相同。
如果您不想[或不能使用]编译器扩展(由于可移植性问题),那么结构不是 [直接] 方法。
在那种情况下,您仍然可以在代码中使用结构,但您应该实现自定义序列化/反序列化例程,以构建要传输的缓冲区(同时考虑主机到网络和网络到主机的字节顺序和永远不要使用 float
/ double
类型 [FPU] 除非你在序列化例程中涵盖这些转换).
此外,请查看 this question,并阅读 所有 中获得正面投票评级的答案(我只需要补充一点,你应该只在处理网络通信时使用 stdint.h
类型。