К основным возможностям Boost.Asio можно отнести следующие:
- возможность написания кросс-платформенного сетевого кода, работающего на большом количестве платформ - Windows, практически все Unix-подобные ОС, Tru64
- поддержка как IPv4, так и IPv6
- работа с TCP & UDP
- поддержка выполнения асинхронных операций
- возможность использования интерфейсов, совместимых с std::iostream
- поддержка SSL
- поддержка отложенных операций (таймеры)
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.
Я думаю, что на основе данной заметки может получится написать более подробную статью, но это задел на будущее, а пока можно задавать мне вопросы :-)
Комментариев нет:
Отправить комментарий