2011-07-21 4 views
2

これは学校向けですが、宿題ではありません。私はRDTがどのように実装されているかを理解しようとしており、シミュレータを作成した別の学校を見つけることができましたが、送信者と受信者を入力するだけです。とにかく、私はそれが適切に動作することはできません。送信者と受信者の両方に擬似コードとFSM図があります。私は送信者が正しいと信じていますが、私は受信者についてあまり確信していません。以前は有限状態機械のダイアグラムを扱ったことがなかったので、私はまだそれを理解しようとしています。実際のJavaコードに対する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方法は、Alを実装さ

グローバル変数

FMS receiver

私は心配する必要はありません。また、isPktCorruptは、現在のパケットのチェックサムを格納したものと照合するメソッドです。

これは正しいと思われますか?疑似コードも正しいですか?最初のパケットは正常に実行され、2番目のパケットは再送を試み続けます。私はなぜか分からない。私が必要な場合は、私も送信者を投稿します。ありがとう!

答えて

1

このコードは正しいです。私は送信者(マイナー)にいくつかのエラーを見つけましたが、完全にオフにしました。私はレシーバーコードで1つのことを変更しなければなりませんでした。それはbstateの増分です。誰もが疑問に思っている、あるいは同様の疑問を持っている場合、このコードはFSMと相関して動作します。

関連する問題