これは学校向けですが、宿題ではありません。私は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を実装さ
グローバル変数
私は心配する必要はありません。また、isPktCorruptは、現在のパケットのチェックサムを格納したものと照合するメソッドです。これは正しいと思われますか?疑似コードも正しいですか?最初のパケットは正常に実行され、2番目のパケットは再送を試み続けます。私はなぜか分からない。私が必要な場合は、私も送信者を投稿します。ありがとう!