Goz*_*Goz 16 c++ oop networking packets
我写了很多网络系统,并且很清楚网络是如何工作的.但是我总是最终拥有一个数据包接收功能,这是一个巨大的switch语句.这开始转向我.我宁愿采用一种优雅的面向对象的优雅方式来处理接收数据包,但每当我尝试提出一个好的解决方案时,我总会遇到问题.
例如,假设您有一个网络服务器.它只是在那里等待回应.数据包进入,服务器需要验证数据包,然后需要决定如何处理它.
目前我一直在通过打开标头中的数据包ID然后拥有一大堆处理每种数据包类型的函数调用来实现这一目标.对于复杂的网络系统,这会产生一个单一的switch语句,我真的不喜欢这样处理它.我考虑过的一种方法是使用处理程序类的映射.然后我可以将数据包传递给相关的类并处理传入的数据.我遇到的问题是我需要一些方法来使用地图"注册"每个数据包处理程序.这意味着,通常,我需要创建类的静态副本,然后在构造函数中将其注册到中央数据包处理程序.虽然这有效,但它看起来似乎是处理它的一种不雅和繁琐的方式.
编辑:同样,理想的是拥有一个兼顾两种方式的漂亮系统.即一种类结构,它容易处理发送与接收它们相同的数据包类型(显然通过不同的功能).
有人能指出我更好的方法来处理传入的数据包吗?非常感谢链接和有用的信息!
如果我没有很好地描述我的问题而道歉,因为我无法很好地描述它也是我从未设法提出解决方案的原因.
关于处理数据包类型的方式:对我来说,地图是最好的.但是我使用普通数组(或矢量)而不是地图.如果从0开始按顺序枚举数据包类型,它将使访问时间保持不变.
至于班级结构.有些库已经完成这项工作:可用的游戏网络协议定义语言和代码生成.例如谷歌的协议缓冲区似乎很有希望.它为协议描述中的每条消息生成一个包含getter,setter,serialization和deserialized例程的存储类.协议描述语言或多或少看起来很丰富.