处理协议通信最常用的流程控件是什么?
时间:2020-03-05 18:53:54 来源:igfitidea点击:
我正在重写代码以处理某些嵌入式通信,现在协议处理是在带有大case / switch语句的While循环中实现的。这种方法似乎有点笨拙。实现通信协议最常用的流控制方法是什么?
解决方案
回答
如果我们退出协议标头中的字段以将我们定向到该协议的下一阶段处理,则可以使用函数指针数组。我们可以使用协议标头中的值来索引数组并调用该协议的函数。
我们必须处理此数组中所有可能的值,即使无效的值也是如此。最终,我们将得到一个包含无效值的数据包,这可能是由于有人正在尝试攻击,或者是因为该协议的将来版本会添加新值。
回答
如果要处理所有一种协议,那么switch / case语句可能是最好的选择。但是,我们应该将所有单个消息处理程序分解为各自的功能。
如果switch语句包含任何实际可处理消息的代码,则比将它们分开更好。
如果它正在处理多个相似的协议,则可以创建一个类来基于同一个抽象类来处理每个协议,并且当连接建立时,可以确定它是哪种协议,并创建适当的处理程序类的实例来解码和处理通信。 。
回答
我认为这很大程度上取决于我们使用的语言以及我们可以使用的数据集对象类型。
例如,在python中,我们可以创建一个包含所有不同处理语句的Dictionary对象,并对其进行迭代以找到正确的要调用的方法/函数。
Case / Switch语句不是一件坏事,但是如果它们变得很大(例如它们可以使用大量协议处理程序),那么它们将变得难以操作。
回答
听起来" while + switch / case"是一个状态机实现。我相信,经过深思熟虑的状态机通常是实现协议的最简单,最易读的方式。
当涉及到状态机时,要打破一些传统的编程规则是必然的。诸如"每个函数应少于25行"之类的规则根本行不通。甚至有人可能认为状态机是伪装的GOTO。