#6 dyvniy » Ср, 10 июня 2015, 18:36:36
Снова про Boost:asio
http://alexott.net/ru/cpp/BoostAsioNotes.html- Спойлер
- Что такое Boost.Asio и зачем он нуженRussian · English
ГлавнаяИнформационная безопасностьФункциональное программированиеLispClojureSchemeErlangC++Open Source ProjectsEmacsСтатьи
Проблема написания на С++ кросс-платформенного кода для работы с сетью существует достаточно давно, и для решения этой проблемы было создано некоторое количество библиотек. Но Boost.Asio можно назвать лучшей реализацией среди существующих. На базе Boost.Asio уже построено несколько библиотек (libpion, cpp-netlib), и кроме того, ведется разработка новых. Кроме того, на базе Boost.Asio я спроектировал и разработал подсистему фильтрации для системы фильтрации веб-трафика СКВТ "Дозор-Джет".
К основным возможностям Boost.Asio можно отнести следующие:
возможность написания кросс-платформенного сетевого кода, работающего на большом количестве платформ - Windows, практически все Unix-подобные ОС, Tru64
поддержка как IPv4, так и IPv6
работа с TCP & UDP
поддержка выполнения асинхронных операций
возможность использования интерфейсов, совместимых с std::iostream
поддержка SSL
поддержка отложенных операций (таймеры)
Для меня, самым главным преимуществом Boost.Asio (не считая высокой переносимости кода) является то, что на каждой платформе реализуется наиболее эффективная стратегия работы (epoll на Linux 2.6, kqueue на FreeBSD/MacOSX, Overlapped IO на MS Windows), и то, что библиотека позволяет использовать разные стратегии — синхронная и асинхронная работа с сокетами, использование потокового ввода-вывода, совместимого с std::iostream. И эти стратегии можно смешивать, например, принимать соединения используя асинхронную обработку событий, а затем, запускать нить, которая будет использовать синхронный ввод-вывод данных (пример test-otpc.cpp).
Для демонстрации возможностей Boost.Asio я написал (частично адаптировав примеры из поставки) несколько примеров, реализующих разные стратегии обработки данных (большее количество примеров, можно найти на домашней странице Boost.Asio). Я использовал эти примеры для оценки применимости разных стратегий в своих разработках. Все эти примеры реализуют "тупой" веб-сервер — он принимает запрос, и отдает одну и ту же страницу, независимо от указанного URL. Сейчас выложены следующие примеры (все исходные тексты включают в себя файл common.h):
test-mcmt.cpp — реализует обработку данных в соответствии со стратегией Many Connections/Many Threads: запускается несколько нитей выполнения, которые по очереди принимают соединение и обрабатывают запросы в асинхронном режиме;
test-otpc.cpp — реализует обработку данных в соответствии со стратегией One Thread per Connection: одна нить выполнения асинхронно принимает соединения (файлы test-otpc-conn.cpp & test-otpc-conn.hpp), а затем запускает новую нить, в пределах которой используется синхронный ввод-вывод;
test-otpc-tp.cpp — аналогично test-otpc.cpp, но новая нить не создается каждый раз, а используется пул нитей, реализуемый библиотекой threadpool.
Для сборки примеров (исходники лежат на github) нужен boost версии 1.35 или выше.
Я думаю, что на основе данной заметки может получится написать более подробную статью, но это задел на будущее, а пока можно задавать мне вопросы ![Smile :-)](./images/smilies/icon_smile.gif)
Last change: 05.03.2013 16:54
![Изображение](http://solaris-club.net/lines/1_30_19_4_2015_5_.png)