Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save iamtakingiteasy/47919c5b593dbc03b6fd5c8bddb0c498 to your computer and use it in GitHub Desktop.

Select an option

Save iamtakingiteasy/47919c5b593dbc03b6fd5c8bddb0c498 to your computer and use it in GitHub Desktop.
     ________________________________________________
    |        Инициализация локальных переменных      |
    |        Разбор аргументов командной строки      |
    |        Резолв хостнеймов в inet-структуры      |
    |              Запуск слушающего сервера         |
    |               Конфигурация поллера             |
    |     Установка обработчиков сигналов процессу   |
     ------------------------------------------------
     _________________________|______________________
    |            Логирование старта работы           |
     ------------------------------------------------
                              |
                              |<---------------------------------.
      ________________________|_______________________           |
     /                      Цикл                     /           |
    ------------------------------------------------             |
     _________________________|______________________            |
    |             Ожидание событий от поллера        |           |
     ------------------------------------------------            |
                              |                                  |
.---------------------------->|                                  |
|     ________________________|_______________________           |
|    / Для каждого файлового дескриптора с событиями /           |
|   ------------------------------------------------             |
|     ________________________|______________________            |
|   | Если тип события:                              |           |
|   | - Подключение нового клиента ------------------|--.        |
|   | - Данные от клиента ---------------------------|--|--.     |
|   | - Данные от сервера ---------------------------|--|--|--.  |
|   | - События закончились -------------------------|--|--|--|--`
|    ________________________________________________|  |  |  |
|                                                       |  |  |
^    ________________________________________________   |  |  |
|   |               Принять подключение              |<-'  |  |
'---|       Проинициалзировать контекст клиента      |     |  |
^    ------------------------------------------------      |  |
|    ________________________________________________      |  |
'---|             Вычитать HTTP-заголовки            |<----'  |
^   |      Добавить заголовок с именем пользователя  |        |
|   |                  Вычитать тело                 |        |
|    ------------------------------------------------         |
|    ________________________________________________         |
'---|              Вычитать ответ сервера            |<-------'
    |     Передать ответ запросившему его клиенту    |
    |      Закрыть дескрипторы сервера и клиента     |
    |     Удалить закрытые дескрипторы из поллера    |
     ------------------------------------------------

В случае получения сигнала SIGINT или SIGTERM, логируется завершение работы

Выход из обработчика модуля                             Выход из обработчика модуля
с применением изменений                                 без изменений
^                                                       ^
|    ________________________________________________   |
|   /       Если протокол IP-пакета == 0x06 (TCP)    \  |
|   \________________________________________________/  |
|          да                           нет             |
|           |                            '--------------'
|    _______v________________________________________   ^
|   |      Декодирование полученного TCP-пакета      |  |
|   | Применение аккумулированых изменений в SEQ и   |  |
|   | ACK числах TCP-потока для данного TCP пакета   |  |
|    ------------------------------------------------   |
|                             |                         |
|    _________________________|____________________     |
|   / Если пакет исходящий и тело пакета начинается \   |
|   |      с литерала одного из HTTP-методов         |  |
|   \_______________________________________________/   |
|          да                           нет             |
|           |                            '--------------'
|    _______v________________________________________
|   |             Найти конец заголовков             |
'---|    Добавить заголовок с именем пользователя    |
     ------------------------------------------------
Выход из обработчика модуля                             Выход из обработчика модуля
с применением изменений                                 без изменений
^                                                       ^
|     _______________________________________________   |
|    /       Если протокол IP-пакета == 0x06 (TCP)   \  |
|   |                 и пакет исходящий               | |
|    \_______________________________________________/  |
|          да                           нет             |
|           |                            '--------------'
|    _______v_________________________________________   
'---|             Добавить IP-опцию метки             |
     -------------------------------------------------
     ________________________________________________
    |        Инициализация локальных переменных      |
    |        Разбор аргументов командной строки      |
    |         Инициализация модулей приложения       |
    |    Открытие дескриптора коммуникации с ядром   |
    |  Нахождение значений MTU доступных интерфейсов |
    |     Установка обработчиков сигналов процессу   |
    |            Логирование старта работы           |
     ------------------------------------------------
                              |
                              |<---------------------------------.
      ________________________|_______________________           |
     /                      Цикл                     /           |
    ------------------------------------------------             |
     _________________________|______________________            |
    |     Получение пакета в userspace от ядра        |          |
    |      Декодирование полученного IP-пакета        |          |
    |         Применение модулей к IP-пакету          |          |
     -------------------------------------------------           |
      ________________________|______________________            |
     /  Если хотя бы один модуль изменил пакет или   \           |
    |             передачу его без изменений          |          |
     \_______________________________________________/           |
           да                           нет                      |
            |                            '-----------------------'
     _______v_________________________________________           ^
    | Пакет кодируется обратно согласно IP-протоколу, |          |
    |     при необходимости фаргментируется по MTU    |          |
     -------------------------------------------------           |
                              |                                  |
                               '---------------------------------'

В случае получения сигнала SIGINT или SIGTERM, логируется завершение работы

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment