FSM для фактического кода Java.Не уверен, что код правильный - PullRequest
2 голосов
/ 22 июля 2011

Это для школы, но не для домашней работы. Я пытаюсь понять, как реализован RDT, и я смог найти другую школу, в которой уже был создан симулятор, но мне просто нужно заполнить отправителя и получателя. Во всяком случае, я не могу заставить его работать должным образом. Для отправителя и получателя имеется некоторый псевдокод и диаграмма FSM. Я считаю, что отправитель верен, но я не слишком уверен в получателе. Я никогда раньше не имел дело с диаграммами конечных автоматов, поэтому я все еще пытаюсь это выяснить.

Я перечислю получателя, чтобы убедиться, что это правильно, и опубликую больше кода, если это будет необходимо.

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 Ответ

1 голос
/ 23 июля 2011

Этот код правильный. Я нашел некоторые ошибки в моем отправителе (незначительный), но это полностью сбило его. Однако мне пришлось изменить одну вещь в коде получателя, и это было увеличение bstate. Таким образом, в случае, если кто-то задается вопросом или имеет подобный вопрос, этот код соответствует FSM, и он работает.

...