gpt4 book ai didi

networking - 分组数据结构?

转载 作者:行者123 更新时间:2023-12-04 22:38:55 25 4
gpt4 key购买 nike

我正在设计一个游戏服务器,我以前从未做过这样的事情。我只是想知道数据包的良好结构是什么?如果重要的话,我正在使用 TCP。这是一个示例,以及我目前正在考虑使用的示例:

(括号中的每个值都是一个字节)

[Packet length][Action ID][Number of Parameters]
[Parameter 1 data length as int][Parameter 1 data type][Parameter 1 data (multi byte)]
[Parameter 2 data length as int][Parameter 2 data type][Parameter 2 data (multi byte)]
[Parameter n data length as int][Parameter n data type][Parameter n data (multi byte)]

就像我说的,我之前真的从来没有做过这样的事情,所以我上面的内容可能是完整的公牛,这就是我问的原因;)。另外,是否需要传递总数据包长度?

最佳答案

传递总数据包长度是一个好主意。它可能会多花费两个字节,但您可以查看并等待套接字在接收之前准备好 sip 的完整数据包。这使代码更容易。

总的来说,我同意 brazzy,一种语言提供的序列化机制比任何自制的都要好。

除此之外(我认为您使用的是没有序列化的 C 语言),我会将数据包 ID 作为数据包数据结构的第一个数据。恕我直言,这是某种约定,因为结构的第一个数据成员始终位于位置 0 并且任何结构都可以向下转换为该位置,以识别其他匿名数据。

您的编译器可能会也可能不会生成打包结构,但这样您就可以分配缓冲区,读入数据包,然后根据第一个数据成员转换结构。如果您不走运并且它不会产生压缩结构,请确保为每个将从(显然非目标)内存构造的结构具有序列化方法。

Endiannes 是一个因素,尤其是在类 C 语言中。请务必明确数据包始终具有相同的字节序,或者您可以根据签名或其他内容识别不同的字节序。一件非常酷的奇怪事情:C# 和 .NET 似乎总是以小端约定保存数据,当您使用本文中讨论的方法访问它们时。在将此类应用程序移植到 SUN 上的 Mono 时发现了这一点。很酷,但如果你有这样的设置,你应该使用 C# 的序列化方法。

除此之外,您的设置看起来很不错!

关于networking - 分组数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394908/

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