Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2019, 11:47   #1
S.Ruslan
Пользователь
 
Регистрация: 15.07.2018
Сообщений: 25
По умолчанию [Boost] ASIO Buffer

Доброго времени суток, использую библиотеку Boost(на данный момент v1.67.0).
В документации написано:
We use a boost::array to hold the received data. The boost::asio::buffer() function automatically determines the size of the array to help prevent buffer overruns. Instead of a boost::array, we could have used a char [] or std::vector.
Код:
for (;;)
    {
      boost::array<char, 128> buf;
      boost::system::error_code error;

      size_t len = socket.read_some(boost::asio::buffer(buf), error);

      if (error == boost::asio::error::eof)
        break; // Connection closed cleanly by peer.
      else if (error)
        throw boost::system::system_error(error); // Some other error.

      std::cout.write(buf.data(), len);
    }
я пробую использовать std::vector
Код:
void bind_Read(){
//std::vector<char> buff; - объявлено в client.h
		socket_.async_read_some(
			boost::asio::buffer(buff),
			boost::bind(
				&handle_read,
				this,
				boost::asio::placeholders::error,
				boost::asio::placeholders::bytes_transferred
			)
		);
	}
и у меня это не работает. Вызывается handle_read, но вектор пуст!
Кто-нибудь использовал вектор вместо статичного массива char[]?
S.Ruslan вне форума Ответить с цитированием
Старый 25.03.2019, 12:07   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А buff.size() у нас равно чему?
waleri вне форума Ответить с цитированием
Старый 25.03.2019, 12:18   #3
S.Ruslan
Пользователь
 
Регистрация: 15.07.2018
Сообщений: 25
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А buff.size() у нас равно чему?
0.

Вообще странное поведение, заменяю data_(char data_[1024]) на buff(std::vector<char> buff)

и handler_read начинает вызываться постоянно не зависимо от того пришли данные или нет.
S.Ruslan вне форума Ответить с цитированием
Старый 25.03.2019, 12:31   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от S.Ruslan Посмотреть сообщение
0.
И чего вы хотите? В доке же ясно написано, что буфер создается из {&data[0], size()} и никогда автоматически не ресайзится.

Цитата:
Сообщение от S.Ruslan Посмотреть сообщение
и handler_read начинает вызываться постоянно не зависимо от того пришли данные или нет.
Так буфера нет куда складывать, сменить надоть...
p51x вне форума Ответить с цитированием
Старый 25.03.2019, 12:54   #5
S.Ruslan
Пользователь
 
Регистрация: 15.07.2018
Сообщений: 25
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И чего вы хотите? В доке же ясно написано, что буфер создается из {&data[0], size()} и никогда автоматически не ресайзится.


Так буфера нет куда складывать, сменить надоть...
Т.е. буфер всегда фиксированной длинны должен быть?
S.Ruslan вне форума Ответить с цитированием
Старый 25.03.2019, 12:58   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

https://www.boost.org/doc/libs/1_69_...ce/buffer.html
Цитата:
A buffer object represents a contiguous region of memory as a 2-tuple consisting of a pointer and size in bytes. A tuple of the form {void*, size_t} specifies a mutable (modifiable) region of memory. Similarly, a tuple of the form {const void*, size_t} specifies a const (non-modifiable) region of memory.
Цитата:
An individual buffer may be created from a builtin array, std::vector, std::array or boost::array of POD elements. This helps prevent buffer overruns by automatically determining the size of the buffer
Цитата:
Note that a vector is never automatically resized when creating or using a buffer. The buffer size is determined using the vector's size() member function, and not its capacity.
Что вы понимает под должен быть фиксированной длинны, если функция принимает объект буфер фактически состоящий из указателя на память и ее размер?
p51x вне форума Ответить с цитированием
Старый 25.03.2019, 13:20   #7
S.Ruslan
Пользователь
 
Регистрация: 15.07.2018
Сообщений: 25
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что вы понимает под должен быть фиксированной длинны, если функция принимает объект буфер фактически состоящий из указателя на память и ее размер?
в данный момент я использую массив символов char[] длинной 1024 байта в качестве буфера. Если данные превышают размер буфера, нужно дополнительно обрабатывать сложившуюся ситуацию.
Я преследую цель абстрагироваться от фиксированного размера буфера, что бы сколько бы данных не пришло, они писались в один буфер.
Я могу это сделать средствами библиотеки?
S.Ruslan вне форума Ответить с цитированием
Старый 25.03.2019, 13:34   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Берите streambuf с начальным 1024, при необходимости увеличивайте и запускайте еще async_read_some.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание тестовой нагрузки на сервер(std::thread, boost::asio) halcyon C/C++ Сетевое программирование 2 24.04.2015 11:23
boost/asio MayhemWithMercy C/C++ Сетевое программирование 1 11.06.2014 17:44
boost ASIO сериализация Kukurudza Общие вопросы C/C++ 2 06.12.2011 13:38
Boost::Asio on Mingw russian-stalker Общие вопросы C/C++ 0 05.01.2011 16:27
Boost (asio + thread) - noncopyable MInner Общие вопросы C/C++ 1 06.12.2009 16:41