Menu
07.06.2015| Наталья| 3 комментариев

Boost.Asio C++ Network Programming John Torjo

У нас вы можете скачать книгу Boost.Asio C++ Network Programming John Torjo в fb2, txt, PDF, EPUB, doc, rtf, jar, djvu, lrf!

Asio — дополнительные темы В этой главе мы рассмотрим некоторые из не очень известных особенностей Boost. Объекты std streams и streambuf иногда немного сложнее в использовании, но, как вы сами убедитесь, у них есть свои преимущества. Наконец, вы увидите довольно позднее добавление в Boost.

Asio — co-routines, которое позволит вам иметь асинхронный код, но легко читаемый как буд-то бы он синхронный. Это довольно удивительная особенность. Но, если вы хотите большей гибкости, то можете использовать streambuf.

Вот самое простое и худшее, что вы можете сделать с объектом streambuf: Чтобы написать что-то в объект streambuf вы будете делать что-ото похожее на следующее: Asio проделали большую работу по интеграции STL потоков и сетей. При написании чего-то, что будет передаваться по сети, очень вероятно, что вы будете иметь больше одной части данных. Таким образом, в конечном итоге, вы добавите данные в буфер.

Если эти данные не являются строкой, то вы должны в первую очередь преобразовать их в строку. То же самое происходит и на другой стороне, при чтении сообщения; вам нужно разобрать его, то есть, прочитать одну часть данных за один раз и, если данные не являются строкой, необходимо их преобразовать. Наконец, известен довольно крутой трюк, чтобы сбросить содержимое объекта streambuf в консоли, используйте следующий код: Кроме того, у него есть несколько дополнительных функций, таких как: Он может быть использован для чтения или записи.

Результат работы этой функции может быть использован с любой независимой функцией из Boost. Asio, производящей запись, а не только с теми, которые работают с объектами streambuf. За исключением двух последних функций, остальные не так легко понять. Другими словами, если есть данные для чтения, то вы сможете их прочитать. Следующий пример не будет дампом чего-то: Вы должны двигать его самостоятельно, как показано ниже: Если вы хотите, чтобы данные уничтожались, то посмотрите как это реализуется: Используйте предыдущие функции, если хотите тонкой настройки.

Даже если вы можете использовать один и тот же экземпляр streambuf для чтения и записи, то я все равно рекомендую вам два отдельных экземпляра, один для чтения, другой для записи. Это воспринимается проще и яснее, и вы избежите многих возможных ошибок.

Независимые функции, работающие с объектами streambuf В следующем списке показаны независимые функции из Boost. Asio, которые работают с объектами streambuf: Завершающая функция является не обязательной. Если же она есть, то она вызывается после каждой успешной операции чтения и сообщает Boost. Asio, если операция завершена если нет, то продолжает читать.

Ее сигнатура выглядит следующим образом: Обратите внимание, что это не относится к сокетам так как они не моделируют концепцию случайного потока. Если совпадение найдено, то вернется пара passed-end-of-match установиться в true , если же совпадений не выявлено, то вернется другая пара begin установится в false. Завершающая функция является необязательной и ее поведение похоже на завершающую функцию read: Asio, как его собрать, а так же несколько примеров. Вы узнаете, что Boost.

Asio больше, чем сетевая библиотека. Так же вы узнаете о самом важном классе, который находится в самом сердце Boost. Есть много реализаций для решения сетевых задач, но Boost.

Asio превзошел их все; он был принят в Boost в и с тех пор был протестирован большим количеством пользователей Boost, используется во многих проектах, таких как: Asio успешно абстрагирует понятия input и output, которые работают не только для работы в сети, но и для последовательных COM-портов, файлов и так далее. Кроме этого вы можете делать input или output программирование синхронным или асинхронным: Библиотека является переносимой, работает на большинстве операционных систем и хорошо масштабируется при более чем тысяче одновременных подключений.

Asio была принята в Boost 1. Первоначально автором является Кристофер Кохлхофф Christopher M. Kohlhoff , с ним можно связаться по адресу chris kohlhoff. Библиотека была протестирована на следующих платформах и компиляторах: Asio зависит от следующих библиотек: Asio это чисто заголовочная библиотека.

Однако, в зависимости от компилятора и размера вашей программы, вы можете выбрать создание Boost. Asio как исходного файла. Вы можете сделать это для уменьшения времени компиляции. Это может быть сделано следующими способами: Asio зависит от Boost. System и необязательно от Boost.

Regex, так что вам нужно, по крайней мере, построить библиотеку boost, используя следующий код: Asio, независимо от того был ли Boost скомпилирован с поддержкой потоков. Синхронный против асинхронного Во-первых, асинхронное программирование чрезвычайно отличается от синхронного программирования. В синхронном программировании все операции вы делаете в последовательном порядке, такие как чтение запрос из сокета S, а затем написать ответ в сокет. Каждая из операций является блокирующей.

С другой стороны, асинхронные программы управляются событиями. Вы начинаете операцию, но вы не знаете, когда она закончится; вы предоставляете callback функцию, которая будет вызываться API с результатом операции, когда операция завершится. Для программистов, которые имеют большой опыт работы с QT — кросс-платформенной библиотекой от Nokia для создания графических приложений пользовательского интерфейса, это вторая натура.

Таким образом, в асинхронном программировании вам не обязательно иметь больше, чем один поток. Вы должны решить на ранней стадии вашего проекта желательно в начале какой подход вы будете использовать: Подумайте перед тем как захотите использовать либо блокирующие вызовы и много потоков синхронная, как правило, проще либо мало потоков и события асинхронный, как правило, более сложный.

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

Для создания простого асинхронного клиента вы будете делать что-то похожее на следующее: Вы указываете где подключается и создается сокет. Обратите внимание, что цикл service. Каждая асинхронная операция имеет завершающий обработчик, функцию, которая будет вызвана, когда операция завершится. Следующий код это простой асинхронный сервер: Затем вы указываете порт, который будете прослушивать. Потом создаете акцептор — объект для приема клиентских подключений, а так же создаете фиктивный сокет и асинхронно ждете подключения клиента.

Наконец, запускаете асинхронный цикл service. Исключения против кодов ошибок Boost. Asio позволяет использовать как исключения так и коды ошибок. Все синхронные функции имеют перегрузки выбрасывающие исключения в результате ошибки или возвращает код ошибки. Если функция падает, то она выбрасывает boost:: Взгляните на следующий фрагмент кода: Асинхронные функции никогда не выкидывают исключений и не имеет никакого смысла делать это.

А кто его поймает? В ваших синхронных функциях вы можете использовать как исключения так и коды ошибок что больше захотите , но пользуйтесь чем то одним. Их смешивание может привести к проблемам или даже падению когда вы по ошибке забываете обработать исключение.

Asio находятся в пространстве имен boost:: Asio Когда дело доходит до потоков в Boost. Asio, нам надо поговорить о следующем: Таким образом вам следует избегать таких ситуаций как читать из сокета в одном потоке, а писать в него в другом это рекомендуется вообще, не говоря уже о Boost.

Классы utility обычно не имеет смысла использовать в нескольких потоках, они не потоко-безопасны. Большинство из них используются короткое время, а затем выходят из области видимости. Asio сама по себе может использовать несколько потоков кроме вашего, но гарантируется, что из этих потоков не будет вызываться ваш код. Не только сети Boost. Asio, вы можете легко подключиться к последовательному порту. Вы можете применить это только к асинхронным операциям так как синхронные средства блокирования не имеют временных ограничений.

Например, следующее сообщение от вашего партнера должно прийти к вам через миллисекунд: Asio позволяет использовать синхронные таймеры, но, обычно, они эквивалентны простой операции sleep. Если вы решили создать ваше приложение синхронным, то вам не нужно беспокоиться о том, что я собираюсь показать в этом разделе. В следующих примерах мы имеем три асинхронных операции, два соединенных сокета и таймер ожидания: Не имеет смысла писать следующий код: Во всех трех предыдущих примерах мы ждали три асинхронные операции для завершения.

Чтобы объяснить различия, мы будем считать, что, спустя некоторое время, завершится операция 1 и сразу после этого завершится операция 2. Так же мы предположим, что каждому обработчику потребуется секунда, чтобы завершиться. В первом случае мы ждем завершения всех трех операций в одном потоке.

После завершения первой операции мы вызываем ее обработчик.