Pull to refresh

Boost.Asio C++ Tutorial

Мой первый пост я хотел бы посвятить переводу web-учебника по Boost.Asio. Оригинал материала доступен здесь.

Тем, кто не знает, что такое Boost.Asio, посвящается. Boost.Asio — это кросс-платформенная библиотека С++ для сетевого и низкоуровневого ввода-вывода программирования, которая предоставляет разработчикам, использующим асинхронную модель, современный подход программирования на С++. В нашем случае это будет С++11.

Версия Boost, которую я использую — Boost Version 1.60.0. Скачать можно тут.

Опираясь на свой опыт, хотелось бы сразу решить вопрос с установкой библиотеки. Я использую MVS 15, следовательно ставить Boost мы будем туда.

Установка библиотеки


  • После скачивания архива с библиотекой, распаковываем его на Локальный диск (лучше) С.
  • Открываем папку boost_1_60_0 и запускаем файл bootstrap.bat
  • После того как bootstrap.bat отработает, в папке появится файл b2.exe
  • Запускаем b2.exe и ждем от 5 минут до 1,5 часа (зависит от «машины»)
  • Когда b2.exe отработает, ваша библиотека будет в собранном состоянии, осталось только её подключить в нашу IDE.
  • Запускаем MVS, в вкладке «Вид» находим Property Manager
  • Двойным кликом открываем страницу свойств папки Debug | Win32 и кликаем на VC++ Directories
  • В колонке Include Directories выбираем изменить, далее нажимаем на «папку со *» New Line и указываем ей путь к папке boost_1_60_0, жмём ОК.
  • Проводим аналогию с некоторыми изменениями для колонки Library Directoties, но для неё указываем путь C:\boost_1_60_0\stage\lib, жмём ОК.
  • Библиотека подключена!

Можем приступать!

Basic Skills


Первые пять уроков, или как они называются в учебнике Timer, будут вводными в фундаментальные понятия, необходимые для использования инструмента Asio. Перед тем, как погрузиться в сложный мир сетевого программирования, эти Timers (уроки) иллюстрируют базовые навыки, используя простые асинхронные таймеры.

Урок 1. — Использование синхронного таймера. "Timer.1 — Using a timer synchronously"

Этот урок вводит нас в Asio, показывая, как выполняется ожидание по таймеру. Начнём мы с подключения заголовочных файлов. Все Asio классы представлены в виде файлов с расширением Asio.hpp.

#include <iostream>
#include <boost/asio.hpp>

Так как в этом примере мы используем таймеры, то мы должны включить соответствующий файл заголовка Boost.Date_Time.

#include <boost/date_time/posix_time/posix_time.hpp>

Все программы, которые используют Asio, должны иметь, по крайней мере, один объект io_service. Этот класс обеспечивает доступ к функциям ввода / вывода. Мы объявляем объект этого типа первым делом в главной функции. Но перед этим я хотел бы немного облегчить написание нашего кода, при помощи пространства имени. После всех подключенных ЗФ, пишем:

using namespace std;
using namespace boost::asio;

Думаю тут особо вопросов не должно возникнуть.

int main()
{
	io_service io;

Далее мы объявляем объект типа deadline_timer. Основные классы Asio, которые обеспечивают функции ввода/вывода (или как в данном случае функциональность нашего Таймера) всегда берут ссылку на io_service в качестве первого аргумента конструктора. Второй аргумент конструктора установка таймера 5 секунд.

deadline_timer t(io, boost::posix_time::seconds(5));

В этом простом примере мы выполняем блокирующие ожидание по таймеру. То есть, вызов deadline_timer :: wait () не вернется, пока таймер не отсчитает 5 секунд после того, как он был создан. Deadline timer, всегда находится в одном из двух состояний: «истек»(expired)или «не истек»(not expired). Если deadline_timer::wait() функция принимает аргумент expired, то функция сразу же вернёт значение.

t.wait();

Наконец мы выводим всеми любимый и знакомый «Hello, World!» сообщение, чтобы показать, когда таймер истек «expired».

  cout << "Hello, world!" << endl;
  _getwch(); //Напиши, чтобы поставить программу в режим ожидания и запечатлеть приветствие! 
  return 0;
}

Полный код программы в оригинале:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
  boost::asio::io_service io;

  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  t.wait();

  std::cout << "Hello, world!" << std::endl;

  return 0;
}

Полный код программы в личном варианте:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

using namespace std;
using namespace boost::asio;

int main()
{
	io_service io;

	deadline_timer t(io, boost::posix_time::seconds(5));
	t.wait();

	cout << "Hello, world!" << endl;

	return 0;
}

На этом наш первый урок заканчивается. Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.