Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.19 KB | None | 0 0
  1. /* Протокол 4 (скользящее окно) является дуплексным. */
  2. #define MAX_SEQ 1 /* в протоколе 4 должно быть равно 1 */
  3. typedef enum { frame_arrival, cksum_err, timeout } event_type;
  4. #include "protocol.h"
  5. void protocol4(void)
  6. // продолжение   254 Глава 3. Канальный уровень Листинг 3.5 (продолжение)
  7. {
  8.    seq_nr next_frame_to_send; /* только 0 или 1 */
  9.    seq_nr frame_expected;     /* только 0 или 1 */
  10.    frame r, s;                /* временная переменная */
  11.    packet buffer;             /* текущий посланный пакет */
  12.  
  13.    event_type event;
  14.    next_frame_to_send = 0; /* номер следующего кадра в исходящем потоке */
  15.    frame_expected = 0;     /* номер ожидаемого кадра */
  16.    from_network_layer(&buffer); /* получить первый пакет у сетевого уровня */
  17.    s.info = buffer; /* подготовить первый кадр для передачи */
  18.    s.seq = next_frame_to_send; /* вставить порядковый номер в кадр */
  19.    s.ack =
  20.    1 - frame_expected; /* подтверждение, посылаемое "верхом" на кадре данных
  21.                         */
  22.    to_physical_layer(&s); /* послать кадр по каналу */
  23.    start_timer(s.seq); /* запустить таймер ожидания подтверждения */
  24.    while (true) {
  25.       wait_for_event(&event); /* ждать возможного события: frame_arrival, */
  26.       /* cksum_err или timeout */
  27.       if (event == frame_arrival) { /* кадр прибыл в целости */
  28.          from_physical_layer(&r);   /* получить кадр */
  29.          if (r.seq == frame_expected) {
  30.             /* обработать входящий поток кадров */
  31.             to_network_layer(&r.info); /* передать пакет сетевому уровню */
  32.             inc(frame_expected); /* инвертировать порядковый номер кадра, */
  33.             /* ожидаемого в следующий раз */
  34.          }
  35.          if (r.ack ==
  36.              next_frame_to_send) { /* обработать исходящий поток кадров */
  37.             from_network_layer(&buffer); /* получить следующий пакет */
  38.             /* у сетевого уровня */
  39.             inc(next_frame_to_send); /* инвертировать порядковый номер */
  40.                                      /* посылаемого кадра */
  41.          }
  42.       }
  43.       s.info = buffer; /* подготовить кадр для передачи */
  44.       s.seq = next_frame_to_send; /* вставить порядковый номер в кадр */
  45.       s.ack =
  46.       1 - frame_expected; /* порядковый номер последнего полученного кадра */
  47.       to_physical_layer(&s); /* передать кадр */
  48.       start_timer(s.seq); /* запустить таймер ожидания подтверждения */
  49.    }
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement