【问题标题】:finite state machine compiler for C to simulate network protocolsC 的有限状态机编译器来模拟网络协议
【发布时间】:2015-06-10 13:23:09
【问题描述】:

我一直在寻找一个好的状态机编译器来测试一些自定义网络协议。我已经查看了一些工具,例如 Yakindu、Ragel(编译器)、SCXML(语言),但我不确定它们是否可以用于网络协议。

SCXML(language) 看起来不错,但我找不到任何专门用于 C 的编译器(scxmlcc 用于 C++)。有谁知道基于 SCXML 的 C 编译器? Yakindu 工具看起来很有前途,但我不确定是否可以测试 BGP/OSPF 等网络协议。任何人都可以请给出任何指示吗? Ragel 看起来也不错,但我再次不确定是否可以使用此编译器生成复杂的网络协议客户端。

我特别提到网络协议的原因是,我还希望能够在“事件”发生后执行自定义例程,例如 packet_create/packet_send(具有自定义数据包大小)等,作为“操作”的一部分。

我是否需要始终从状态图中生成代码,或者有没有办法直接与状态交互? 我对 FSM 很陌生,任何帮助/建议/建议/链接都将不胜感激。

【问题讨论】:

    标签: c network-protocols fsm ragel scxml


    【解决方案1】:

    默认的Yakindu SCT C 代码生成器生成与具体执行环境无关的纯 C 代码。这意味着您可以获得一段标准 C 代码,您可以手动将其集成到您自己的应用程序中。这种手动集成意味着在应用程序和状态机之间映射事件、操作和变量。此外,您必须正确触发状态机执行。

    您可以在user guide 中找到一些相关信息。您还可以自定义代码生成器以满足您的需求,但这只有在与应用程序的集成看起来始终相同并且您希望集成多于一两个状态机时才有意义。

    因此,如果您提供有关应用程序端 API 的更多信息,我可以提供一些关于如何与状态机集成的提示。

    【讨论】:

      【解决方案2】:

      我们刚刚完成了 SCXML -> ANSI C 转换。目前,除了调用之外,它什么都做。 Here 是生成的 ANSI C 代码示例,带有用户提供的回调和通用脚手架 here。 2015 年末 MacBook Pro@3.1GHz 上单个微步的性能测量值为here

      请注意,脚手架使用 C++98,因为我们必须连接到数据模型实现才能通过 SCXML IRP 测试。生成的源代码是 ANSI C。如果你想转换一个 SCXML 状态图,你可以使用 uscxml-transform 作为:

      $ uscxml-transform -tc -i FILE_OR_URL -o GENERATED_HERE
      

      例如,从 STDOUT 上的 SCXML IRP 套件打印 test144 生成的 C 代码:

      $ uscxml-transform -tc -i https://raw.githubusercontent.com/tklab-tud/uscxml/master/test/w3c/ecma/test144.scxml
      

      生成的 ANSI-C 代码通过了所有 SCXML IRP 测试,但针对调用和自定义 I/O 处理器的测试除外。

      【讨论】:

      • 我们仍然不确定用于嵌入的 API,即挂钩到您的实际应用程序代码。如果您有任何建议,请随时在 github 上post an issue
      【解决方案3】:

      LOKI 是一个新的应用程序,旨在为程序员和系统管理员提供一种与 BGP 网络交互的简单方法。也可以使用它来测试您的 OSPF/BGP 连接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 2021-06-21
        相关资源
        最近更新 更多