如何阅读FSM图

Mat*_*att 5 network-programming state-machine packet

FMS

我如何使用此图并将其转换为可用程序.我不太确定如何阅读这个图表.如果有人可以通过我的方式,可能会显示一个代码示例以及它与图表的关系,那就太棒了.

谢谢!

Iva*_*lov 10

里面有文字的圈子是州.文字描述了状态.

虚线箭头指向起始状态.

传出箭头确定此状态可能发生的变化.箭头旁边的文字由线条分为上部和下部.下半部分是执行箭头转换时应执行的操作.上半部分是条件.当它们为真时 - 执行此转换(以及如此低的部分).

Lambda符号表示除转换发生时更改当前状态外,您不应该执行任何操作.

所以较低的部分粗略对应您的功能.上部是你应该等待条件的点 - 轮询或异步等待挂起的I/O数据包,无论如何.

这里有一些类似于C的伪代码(我在这里写了它,所以不要认为它可以工作甚至编译):

enum State { WaitFor0Call, WaitForAck0, WaitForCall1, WaitForAck1 }

int main() {
   State state = WaitFor0Call;
   while (1) {
      switch (state) {
         case WaitFor0Call:
            if (rdt_rcv(rcvpkt)) continue;
            if (rdt_send(data)) {
               state = WaitForAck0;
               sndpkt = make_pkt(0, data, checksum);
               udt_send(sndpkt);
               start_timer();
            }
            break;
         case WaitForAck0:
            // ...similar code...
            break;
         case WaitForCall1:
            // ...similar code...
            break;
         case WaitForAck1:
            // ...similar code...
            break;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

您还应该考虑到接收和发送功能可能是阻塞的,因此代码if (rdt_rcv(rcvpkt)) whatever;在技​​术上是不正确的,因为您不检查rdt_send它直到它返回控制.所以FSM只传达逻辑流程,而不是它应该如何组织的技术方面,线程管理等.我的代码也没有显示这方面,因为它可能会根据您的需要变得非常复杂,因为您没有给出足够的细节对这些事情提出明智的建议:)

我唯一的猜测是你会有某种双向流(分别用于输入和输出),条件就像if (there_is_ready_for_consuming_packet_in_the_input_queue) continue;if (data_was_put_to_outgoing_stream_successfully) ...;