我如何获取这个图表并将其翻译成一个可用的程序。我不太确定如何阅读这张图。如果有人可以带我了解一下,也许可以展示一个代码示例以及它与图表的关系,那就太好了。
谢谢!
最佳答案
里面有文字的圆圈是状态。文本描述了状态是什么。
虚线箭头指向起始状态。
向外的箭头决定了这个状态可以改变的地方。箭头旁边是被线分成上半部分和下半部分的文本。下半部分是执行箭头转换时应该发生的 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/