【发布时间】:2011-10-09 19:23:45
【问题描述】:
我如何获取此图表并将其转换为可用的程序。我不太确定如何阅读此图。如果有人可以指导我,也许可以展示一个代码示例以及它与图表的关系,那就太好了。
谢谢!
【问题讨论】:
标签: network-programming packet state-machine
我如何获取此图表并将其转换为可用的程序。我不太确定如何阅读此图。如果有人可以指导我,也许可以展示一个代码示例以及它与图表的关系,那就太好了。
谢谢!
【问题讨论】:
标签: network-programming packet state-machine
里面有文字的圆圈是状态。文本描述状态是什么。
虚线箭头指向起始状态。
外向箭头确定此状态可能更改的位置。箭头旁边是被线分成上下两部分的文字。下半部分是执行箭头转换时应该发生的动作。上半部分是条件。当它们为真时 - 执行此转换(以及更低的部分)。
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) ...;
【讨论】: