首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象网络

面向对象网络
EN

Stack Overflow用户
提问于 2011-02-08 19:14:59
回答 8查看 4.3K关注 0票数 16

我写了许多网络系统,并且对网络的工作原理有一个很好的了解。然而,我总是有一个数据包接收功能,这是一个巨大的开关语句。这开始影响到我了。我宁愿采用一种很好的、优雅的面向对象的方法来处理接收数据包,但是每次我试图想出一个好的解决方案时,我最终总是会出现问题。

例如,假设您有一个网络服务器。它只是在那里等待回应。一个包进来了,服务器需要验证包,然后它需要决定如何处理它。

目前,我一直在通过打开报头中的数据包id,然后拥有大量函数调用来处理每种数据包类型。对于复杂的网络系统,这会产生一个单块开关语句,我真的不喜欢这样处理它。我考虑过的一种方法是使用处理程序类的映射。然后,我可以将数据包传递给相关类并处理传入的数据。我的问题是,我需要一些方法来“注册”每个数据包处理程序的地图。这意味着,通常,我需要创建类的静态副本,然后在构造函数中将其注册到中心数据包处理程序中。虽然这是可行的,但它看起来确实是一种不雅和微妙的处理方法。

编辑:同样,理想的做法是拥有一个同时工作的好系统。一个类结构,它很容易地处理发送与接收它们相同的数据包类型(显然是通过不同的功能)。

有人能告诉我一个更好的方法来处理传入的数据包吗?链接和有用的信息是非常感谢!

抱歉,如果我没有很好地描述我的问题,因为我无法很好地描述它,这也是我从未想出解决方案的原因。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-02-08 20:57:16

关于处理数据包类型的方法:对我来说,地图是最好的。但是,我会使用普通数组(或向量)而不是地图。如果从0顺序枚举数据包类型,则将使访问时间常量。

关于阶级结构。有些库已经完成了这项工作:可用的游戏网络协议定义语言和代码生成Google的协议缓冲区似乎很有前途。它为协议描述中的每一条消息生成一个包含getter、setters、序列化和反序列化例程的存储类。协议描述语言看起来比较丰富。

票数 5
EN

Stack Overflow用户

发布于 2011-02-08 19:20:24

处理程序实例的映射几乎是处理它的最佳方法。没什么不雅的。

票数 1
EN

Stack Overflow用户

发布于 2011-02-08 20:13:06

在我的经验中,表驱动的解析是最有效的方法。

尽管std::map很不错,但我最终还是使用了静态表。不能将std::map静态初始化为常量表。它必须在运行时加载.表(结构数组)可以声明为数据,并在编译时初始化。我还没有遇到过大到足以让线性搜索成为瓶颈的表格。通常,表的大小足够小,以至于二进制搜索中的开销要比线性搜索慢。

为了获得高性能,我将使用消息数据作为表中的索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4937263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档