Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387

Запись буфера в boost asio

04.02.2014, 05:57. Показов 2775. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучаю данный пример
http://www.boost.org/doc/libs/... server.cpp

Появились некоторые вопросы, которые на localhost проблемно проверить, а знать о ньансах хочется.

Есть вот такой код.
C++
1
2
   boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
1. Тут шлется буфер data_ в сокет. Что будет если он не успеет записаться весь, а сокет примет большую пачку данных и будет указание еще одной записи ? Две асинхронные записи ? Что будет с буфером ? Ведь он глобален для всего класса.

2. Пока идет запись/чтение из одной сессии (async_write) все прочие сессии будут его ждать ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2014, 05:57
Ответы с готовыми решениями:

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу посмотреть простой пример, где сервер...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда https://www.cyberforum.ru/cpp-beginners/thread329576.html И напоролся сразу...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.02.2014, 10:57
Цитата Сообщение от admsasha Посмотреть сообщение
1. Тут шлется буфер data_ в сокет. Что будет если он не успеет записаться весь, а сокет примет большую пачку данных и будет указание еще одной записи ? Две асинхронные записи ?
Если Вы переформулируете свой вопрос, постараюсь ответить.
Сейчас непонятно, что именно имеется в виду. Сокет может принимать данные
только тогда, когда он находится в состоянии обработки команды recv.
"примет большую пачку данных и будет указание еще одной записи" - непонятно.

Что будет с буфером ? Ведь он глобален для всего класса.
Не глобален. Один буфер на один объект session.

Цитата Сообщение от admsasha Посмотреть сообщение
2. Пока идет запись/чтение из одной сессии (async_write) все прочие сессии будут его ждать ?
Нет. Можно запустить несколько операций ввода-вывода и все они будут
выполняться параллельно. А вот обработка завершения уже зависит от того,
сколько потоков выполняют io_service::run - если там только один поток,
как в данном примере, то в один момент времени может выполняться только
один обработчик завершения I/O.
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
04.02.2014, 11:51  [ТС]
Попробую перефразировать.
Допустим данные передаются в течении часа. На boost::asio::async_write не повиснет на весь час ? Как я понял, нет. В течении этого часа шлем еще раз boost::asio::async_write это возможно ? Или в каком то месте кода будет ожидание, того пока не завершит отправку первая порция ? Или всё что я кину в async_write , будет в порядке очереди отправляться ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.02.2014, 12:13
Лучший ответ Сообщение было отмечено admsasha как решение

Решение

Цитата Сообщение от admsasha Посмотреть сообщение
Допустим данные передаются в течении часа. На boost::asio::async_write не повиснет на весь час ?
Async-операции не виснут по определению, они запускают I/O и сразу же
возвращают управление. А вот обработчик завершения I/O может быть вызван
через некоторое время, это зависит от многих факторов. К примеру, если на том
конце упорно не хотят звать recv, передача данных может надолго застопориться.

Цитата Сообщение от admsasha Посмотреть сообщение
В течении этого часа шлем еще раз boost::asio::async_write это возможно ?
Да.

Цитата Сообщение от admsasha Посмотреть сообщение
Или в каком то месте кода будет ожидание, того пока не завершит отправку первая порция ?
Сначала отработает первая операция, затем вторая.
Точно также, как если бы сначала запустить первую операцию,
дождаться ее завершения, а затем запустить вторую.

Цитата Сообщение от admsasha Посмотреть сообщение
Или всё что я кину в async_write , будет в порядке очереди отправляться ?
Здесь речь про TCP, это протокол, который гарантирует порядок данных.
Если пишется А, затем Б, потом В, то они в таком порядке и отправляются в сокет.
1
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
04.02.2014, 14:23  [ТС]
Большое спасибо за ответы! Стало действительно понятнее...

И, надеюсь, последний момент.

Например, я создаю свою переменную
C++
1
char mystr[max_length];
В неё копирую значение какое либо. И передаю в async_write
C++
1
2
boost::asio::async_write(socket_, boost::asio::buffer(mystr, str(mystr)),   //  \0 пока не учитываем, это я для упращения.
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
т.к. произойдет выход из функции do_write, то и значение mystr уничтожится. На сколько я понял async_write не копирует значение, а использует ссылку. Это так ? Если да, то в простом случае, данные будут не дозаписываться, т.к. будут не успевать. Прошу подсказать, как грамотно в данном случае поступить?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.02.2014, 14:35
admsasha, Если переменная mystr выйдет из области видимости, тогда не будет ровным счетом ничего хорошего. Нужно гарантировать, что память будет доступна. Если нет возможности это сделать - стоит использовать динамическую память, в частности можно использовать boost::shared_array.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.02.2014, 14:45
Цитата Сообщение от admsasha Посмотреть сообщение
На сколько я понял async_write не копирует значение, а использует ссылку. Это так ?
Ответы на такие вопросы всегда лучше искать в официальной документации.
Да, буфер не копируется. Для высоконагруженных сетевых приложений это критично,
поэтому везде, где только возможно, принято обходиться без копирования.

Цитата Сообщение от admsasha Посмотреть сообщение
Если да, то в простом случае, данные будут не дозаписываться, т.к. будут не успевать. Прошу подсказать, как грамотно в данном случае поступить?
Простейший способ - создавать буфер в динамической памяти и передавать
его указатель в обработчик, где обрабатывать результат и вызывать delete.
Лучше обернуть все это в смарт-поинтеры (shared_array, например).
Если производительность не устроит (а она устроит в 95% случаев), можно
подумать про какой-нибудь пул буферов разного размера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2014, 14:45
Помогаю со студенческими работами здесь

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта никак не могу разобраться в их работе. Вот...

boost::asio cессии
Здравствуйте. Хотелось бы узнать ответ на вопрос, который не где не нашол. Сервер реализован на Boost:asio, к нему подключаются клиенты,...

Winsock vs boost::asio
у Winsock преимущество - это есть русская документация(это не совсем документация но крис касперски объянять умеет) у asio...

boost::asio пример
Привет! Можно, пожалуйста, простейший пример работы с boost::asio - клиент-серверная программа, клиент которой должен отсылать...

C++ | boost::asio + ssl?
Доброго времени суток! Хотелось бы узнать как подключаться по SSL? int main() { boost::asio::ip::tcp::iostream stream; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru