2011-07-21 50 views
2

這是爲了學校,但不是功課。我試圖理解RDT是如何實現的,我能夠找到另一所已經創建了模擬器的學校,但只需填寫發送者和接收者。無論如何,我無法正常工作。發送者和接收者都有一些僞代碼和FSM圖。我相信發送者是正確的,但我不太確定接收者。我以前從來沒有處理過有限狀態機圖,所以我仍然試圖弄清楚。FSM與實際的java代碼。不知道代碼是否正確

我會列出接收器,確保它是正確的,並在需要時發佈更多代碼。

FMS receiver

全局變量:

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是一種用於驗證當前數據包與其存儲的校驗和的方法。

這是否正確?僞代碼是否正確?它對第一個數據包運行正常,然後第二個數據包繼續嘗試重新發送。我不明白爲什麼。如果我需要,我也會發布發件人。謝謝!

回答

1

此代碼是正確的。我確實在我的發件人(未成年人)中發現了一些錯誤,但它完全拋棄了。我不得不在接收者代碼中改變一件事,那就是bstate的增量。所以,如果有人想知道或者有類似的問題,這段代碼確實與FSM有關,它確實有效。