Skip to content

Async.Networking.RU

Anton Kashcheev edited this page Dec 2, 2024 · 11 revisions

Описание асинхронной обработки сетевого трафика в библиотеке

Примитивы

Библиотечные примитивы:

  • flame_ide::os::async::network::Registrar (header) - регистратор событий от сокетов; асинхронно от зарегистированных сокетов получает события и кладёт их в соответствующую очередь.
  • flame_ide::os::network::UdpServer (header) - реализация синхронного UDP-сервера.
  • flame_ide::os::network::UdpClient (header) - реализация синхронного UDP-клиента.
  • flame_ide::os::network::TcpServer (header) - реализация синхронного TCP-сервера.
  • flame_ide::os::network::TcpClient (header) - реализация синхронного TCP-клиента.

Примитивы в обработчике:

  • ServerHandle
  • SessionHandle
  • Internal - PImpl, содержит хранилище сокетов, потоки-воркеры и регистратор сокетов
  • Notificator
  • Worker
  • Workers
  • udp::Storage
  • tcp::Storage

TODO: список чуть больше, @kachsheev дозаполнит

Реализация (Handler)

Схема

Handler

Базовая идея

Handler под капотом реализует многопоточную обработку очередей сокетов:

  • Выдаёт клиентам свои высокоуровневые обёртки вокруг сокетов
  • Подписывается на уведомления от Registrar
  • По уведомлению либо вычитывает данные, либо пишет

Описание алгоритма обработки входящего события

  • РегистраторОбъект-уведомительПоток-обработчикОчередь с данными
    • Регистратор:
      1. Получает событие по конкретному сокету
      2. Записывает в очередь на обработку пару из id сокета и его событие
      3. Через объект-уведомитель сообщает о новом входящем событии
    • Объект-уведомитель:
      • Через триггер отправляет уведомление о новом входящем событии потоку-обработчику
    • Поток обработчик:
      1. Через триггер получает уведомление о новом входящем событии
      2. Вычитывает из очереди регистратора пару (id сокета и событитие)
      3. Выполняет некоторые действия с сокетом
        • Если событие связано с новыми данными, то из сокета производится чтение в очередь с данными
      4. Засыпает до следующего события, если новых нет

Описание алгоритма обработки события от пользователя

  • Объект-обёрткаОчередь с даннымиОбъект-уведомительПоток-обработчик
    • Объект-обёртка:
      1. Копирует данные копируются в очередь
      2. Через объект-уведомитель сообщает о данных на отправку
    • Объект-уведомитель:
      • Через триггер отправляет уведомление об исходящих данных потоку-обработчику
    • Поток-обработчик:
      1. Через триггер получает уведомление о исходящих данных по заданному сокету
      2. Пишет из очереди данные в сокет
      3. Засыпает до следующего события, если новых нет

Отличия реализации алгоритмов при работе с TCP и UDP