【发布时间】:2010-09-09 00:48:52
【问题描述】:
我正在重写代码来处理一些嵌入式通信,现在协议处理是在一个带有大 case/switch 语句的 While 循环中实现的。这种方法似乎有点笨拙。实现通信协议最常用的流控方法有哪些?
【问题讨论】:
标签: c communication protocols
我正在重写代码来处理一些嵌入式通信,现在协议处理是在一个带有大 case/switch 语句的 While 循环中实现的。这种方法似乎有点笨拙。实现通信协议最常用的流控方法有哪些?
【问题讨论】:
标签: c communication protocols
听起来“while + switch/case”是一种状态机实现。我相信经过深思熟虑的状态机通常是实现协议的最简单、最易读的方式。
当涉及到状态机时,打破一些传统的编程规则就在其中。像“每个函数应该少于 25 行”这样的规则是行不通的。甚至有人可能会争辩说,状态机是伪装的 GOTO。
【讨论】:
我认为这在很大程度上取决于您使用的语言,以及您可以使用的数据集对象类型。
例如,在 python 中,您可以创建一个包含所有不同处理语句的 Dictionary 对象,然后遍历该对象以找到要调用的正确方法/函数。
Case/Switch 语句不是坏事,但如果它们变得庞大(就像使用大量协议处理程序一样),那么它们可能会变得难以处理。
【讨论】:
如果只处理一个协议,那么 switch/case 语句可能是您最好的选择。但是,您应该将所有单独的消息处理程序分解为它们自己的函数。
如果您的 switch 语句包含任何实际处理消息的代码,那么最好将它们分开。
如果它正在处理多个类似的协议,您可以创建一个类来处理基于相同抽象类的每个协议,并且当连接进入时,您可以确定它是哪个协议并创建适当的处理程序类的实例来解码和处理通讯。
【讨论】:
如果您关闭协议标头中的字段以引导您进入该协议的下一个处理阶段,则可以使用函数指针数组。您使用协议标头中的值来索引数组并调用该协议的函数。
您必须处理此数组中的所有可能值,即使是那些无效的值。最终,您将收到一个包含无效值的数据包,这可能是因为有人正在尝试攻击,或者是因为协议的未来版本添加了新值。
【讨论】: