2013-02-02 3 views
-3

Я реализую 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(). Правильно, если я ошибаюсь.
  • Должно ли оба приложения иметь одинаковый код, поскольку протокол двунаправлен?
+1

Это простой, неточный код C, его можно сохранить и на Java.Также, пожалуйста, объясните, где именно вас путают по переводу на Java. – fvu

+0

фрагмент здесь почти 1-1 портирован в java. В образце нет нитей. – bestsss

+0

отредактировал вопрос –

ответ

1

при реализации функций wait_for_event() и start_timer().

Они вам не нужны. Используйте DatagramSocket.setSoTimeout() и catch (SocketTimeoutException) соответственно.

Куда следует поместить разъемы UDP? Я думаю, что часть сокета UDP находится внутри to_physical_layer() и from_physical_layer(). Правильно, если я ошибаюсь.

То же место, что и настоящие recv() и send() звонки.

Должно ли оба приложения иметь одинаковый код, поскольку протокол двунаправлен?

Да.

1

Прежде всего: прежде чем инвестировать время и усилия в слой раздвижных окон поверх UDP, проверьте, нужно ли вам такое экзотическое решение. TCP уже делает такие вещи, и многие люди вложили много времени в правильное и надежное. Но, конечно, существуют веские причины для реализации такого решения. Следующим шагом должно стать google вокруг, скорее всего, вокруг уже есть десятки очень похожих программ. Тем более, что у вас, похоже, нет большого опыта работы с сетевыми API-интерфейсами Java, вероятно, гораздо эффективнее начать с рабочего кода Java-кода, чем из примера из книги, которая больше ориентирована на изучение концепций сетей для людей.

В любом случае, если вы хотите переопределить протокол выше, начните с чтения Javadoc для класса DatagramSocket. Он имеет метод setSoTimeout, который может заменить таймер в коде выше, основное отличие состоит в том, что при тайм-ауте receive будет генерировать исключение SocketTimeoutException, и это может немного осложнить поток вашей программы. Забудьте о битах from_physical и to_physical, все эти вещи обернуты классами Socket.

Смежные вопросы