Реализация протокола RDT 3.0 с тайм-аутом

avatar
Juan
8 августа 2021 в 19:35
230
0
0

Я пытаюсь реализовать следующий протокол:

enter image description here

В частности, этапы S1, S2 и S3

Мои мысли:
Я устанавливаю тайм-аут в socket.setSoTimeout() который возвращает SocketTimeOutException на socket.recive() Я не уверен, что это правильный способ его реализации как на схеме, вроде бы таймер должен запускаться сразу после отправки пакета.
Я реализовал следующее:

rSocket.setSoTimeout(timeOut);
try {
    rSocket.receive(packet);
}catch(SocketTimeoutException socketTimeoutException){
    return null;
}
senderSocket.send(datagramPacket);
    Packet responsePacket = Helper.recievePacket(rSocket);
    while(responsePacket==null){
        senderSocket.send(datagramPacket);
         responsePacket = Helper.recievePacket(rSocket);
    }
    if(responsePacket.isCorrupt() || responsePacket.getSequence()!=packetToSend.getSequence())
    {
        
    }

Это обрабатывает ту часть, где тайм-аут происходит из-за задержки ответа. Но программа должна ждать, пока это условие if не будет выполнено. А в случае таймаута снова отправить пакет и дождаться ответа. Я не уверен, какие конструкции программирования на Java я мог бы здесь использовать.

Источник
marco.m
11 августа 2021 в 12:39
0

Интересное упражнение :-) Я предлагаю сделать шаг назад и подойти к этому как к конечной машине, а не как к прямому коду. Преимущество конечного автомата в том, что легче рассуждать и убеждать себя, что реализация соответствует спецификациям. Старайтесь не усложнять, вводя структуру конечного автомата: возможно, лучше изучить основы конечных автоматов и написать простой самостоятельно. Удачи!

Juan
13 августа 2021 в 08:46
0

@marco.m Спасибо за предложение. Не могли бы вы предложить какие-нибудь хорошие ресурсы, чтобы прочитать о конечной машине в целом?

marco.m
13 августа 2021 в 19:22
0

Хотя примеры приведены на Javascript, я думаю, что эта статья является хорошей отправной точкой: dev.to/davidkpiano/….

Ответы (0)