network-programming - 如何阅读 FSM 图

标签 network-programming packet state-machine

FMS

我如何获取这个图表并将其翻译成一个可用的程序。我不太确定如何阅读这张图。如果有人可以带我了解一下,也许可以展示一个代码示例以及它与图表的关系,那就太好了。

谢谢!

最佳答案

里面有文字的圆圈是状态。文本描述了状态是什么。

虚线箭头指向起始状态。

向外的箭头决定了这个状态可以改变的地方。箭头旁边是被线分成上半部分和下半部分的文本。下半部分是执行箭头转换时应该发生的 Action 。上半部分是条件。当它们为真时 - 执行此转换(以及下半部分)。

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;
      }
   }
}

您还应该考虑到接收和发送函数可能会阻塞,因此代码 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) ...;

关于network-programming - 如何阅读 FSM 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6769376/

相关文章:

linux - keepalived 无法在 bond(m=1) 接口(interface)上接收多播数据包,但 tcpdump 可以导致 keepalived 都进入 master

c++ - 如何让这个 Qt 状态机工作?

sockets - 从物理上讲,什么是 socket ?

sockets - HTTP/SOAP 数据包大小

c - 为什么 sendto() 返回 'Invalid argument' ?

firewall - 从 netfilter 接受用户空间中的数据包

Opengl - glDrawBuffers 修改是否存储在 FBO 中?不?

oop - 你会如何给洗衣机编码?

java - 如何在有限的时间内(超时)从 DatagramSocket 中读取数据 block ?

c# - 套接字通信程序测试