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-клиента.

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

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

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

Схема

Handler

Базовая идея

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

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

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

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

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

  • Объект-обёртка --> Очередь с данными --> Объект-уведомитель --> Поток-обработчик
Clone this wiki locally