【问题标题】:FSM to actual java code. Not sure if code is correctFSM 到实际的 java 代码。不确定代码是否正确
【发布时间】:2012-04-25 23:14:32
【问题描述】:

这是给学校的,但不是家庭作业。我试图了解 RDT 是如何实现的,并且我能够找到另一所已经创建了模拟器的学校,但只需要填写发送者和接收者。无论如何,我无法让它正常工作。发送者和接收者都有一些伪代码和 FSM 图。我相信发件人是正确的,但我不太确定收件人。我以前从未处理过有限状态机图,所以我仍在努力解决这个问题。

我将列出接收者以确保正确并在需要时发布更多代码。

全局变量:

  astate =0 // can be 0-3, corresponds to state diagram for a/sender (3.15)
  astored_pkt // saved in case we need to retransmit - for a/sender
  bstate = 0 // can be 0-1,state diagram for b (3.14)
  bOnceThru = 0 // A flag to track if this is the first time through the receiver
  bstored_pkt // saved in case we need to retransmit - for b/sender

伪代码:

bInput
    if pkt is corrupt
        if bOnceThru==1
            send bstored_pkt
        else
            do nothing
    else
        if (seqno==0 && bstate==0) || (seqno==1 && bstate==1)
            deliver data to layer 5
            Print "B: got packet #"
            create bstored_pkt
            sendpkt(bstored_pkt)
            Print "B: sending ACK #"
            incr bstate mod 2
            bOnceThru=1
        else
            if bstate==1 || bOnceThru==1
                send bstored_pkt
                Print "B: sending ACK #"

Java 代码:

protected void bInput(Packet packet){
    if(!isPktCorrupt(packet)){
        if(bOnceThru == 1){
            toLayer3(1,bstored_pkt);
        }else{
            return;
        }
    }else{
        if((packet.getSeqnum() == 0 && bstate == 0) ||
            (packet.getSeqnum() == 1 && bstate == 1)){
                toLayer5(packet.getPayload());
                System.out.println("B: got packet #");
                bstored_pkt = new Packet(packet);
                toLayer3(1,bstored_pkt);
                System.out.println("B: send ACK " + packet.getAcknum());
                bstate = (bstate + 1) % 2;
                if(packet.getSeqnum() == 0) bOnceThru = 1;
            }else{
                if(bstate == 1 || bOnceThru == 1){
                    toLayer3(1,bstored_pkt);
                    System.out.println("B: sending ACK " + packet.getAcknum());
                }
            }
    }

}

toLayer3 和 toLayer5 是已经实现的方法,我无需担心。此外,isPktCorrupt 是一种验证当前数据包的校验和与它存储的内容的方法。

这看起来正确吗?伪代码是否正确?第一个数据包运行正常,然后第二个数据包继续尝试重新发送。我不明白为什么。如果需要,我也会发布发件人。谢谢!

【问题讨论】:

    标签: java network-programming state-machine


    【解决方案1】:

    这段代码是正确的。我确实在我的发件人中发现了一些错误(次要),但它完全把它扔掉了。不过,我必须在接收器代码中更改一件事,那就是 bstate 的增量。因此,如果有人想知道或有类似的问题,这段代码确实与 FSM 相关,并且确实有效。

    【讨论】:

      猜你喜欢
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多