Я реализую 2 приложения, которые используют протокол раздвижного окна в качестве протокола передачи данных и UDP-сокетов для связи. Я пытаюсь реализовать протокол скользящего окна, используя книгу Tanembaum в качестве справочника. Вот код, который я нашел в книге.Как перенести этот код на Java?
/* Protocol 4 (sliding window) is bidirectional and is more robust than protocol 3. */
#define MAX_SEQ 1 /* must be 1 for protocol 4 */
typedef enum {frame_arrival, cksum_err, timeout} event_type;
#include "protocol.h"
void protocol4 (void)
{
seq_nr next_frame_to_send; /* 0 or 1 only */
seq_nr frame_expected; /* 0 or 1 only */
frame r, s; /* scratch variables */
packet buffer; /* current packet being sent */
event_type event;
next_frame_to_send = 0; /* next frame on the outbound stream */
frame_expected = 0; /* number of frame arriving frame expected */
from_network_layer(&buffer); /* fetch a packet from the network layer */
s.info = buffer; /* prepare to send the initial frame */
s.seq = next_frame_to_send; /* insert sequence number into frame */
s.ack = 1 - frame_expected; /* piggybacked ack */
to_physical_layer(&s); /* transmit the frame */
start_timer(s.seq); /* start the timer running */
while (true) {
wait_for_event(&event); /* could be: frame_arrival, cksum_err, timeout */
if (event == frame_arrival) { /* a frame has arrived undamaged. */
from_physical_layer(&r); /* go get it */
if (r.seq == frame_expected) {
/* Handle inbound frame stream. */
to_network_layer(&r.info); /* pass packet to network layer */
inc(frame_expected); /* invert sequence number expected next */
}
if (r.ack == next_frame_to_send) { /* handle outbound frame stream. */
from_network_layer(&buffer); /* fetch new packet from network layer */
inc(next_frame_to_send); /* invert sender's sequence number */
}
}
s.info = buffer; /* construct outbound frame */
s.seq = next_frame_to_send; /* insert sequence number into it */
s.ack = 1 - frame_expected; /* seq number of last received frame */
to_physical_layer(&s); /* transmit a frame */
start_timer(s.seq); /* start the timer running */
}
}
Я немного смущен в переводе этого на java. Я точно не знаю, как здесь применяются потоки. Я ищу любые подсказки и стратегии, которые помогут мне реализовать это.
EDIT
Я больше запутался:
- в реализации wait_for_event функции() и start_timer().
- Куда я должен поместить разъемы UDP? Я думаю, что часть сокета UDP находится внутри to_physical_layer() и from_physical_layer(). Правильно, если я ошибаюсь.
- Должно ли оба приложения иметь одинаковый код, поскольку протокол двунаправлен?
Это простой, неточный код C, его можно сохранить и на Java.Также, пожалуйста, объясните, где именно вас путают по переводу на Java. – fvu
фрагмент здесь почти 1-1 портирован в java. В образце нет нитей. – bestsss
отредактировал вопрос –