2013-03-14 3 views
1

Я просто создаю очень простой класс C++, который предоставляет мне несколько методов, таких как connect() и read(), вместо того, чтобы разоблачать все вызовы сокета Boost.Asio.Прочитайте только нужное количество байтов с помощью Boost.Asio

Прямо сейчас, я пытаюсь выяснить, как создать метод, который считывает только нужное количество байт:

SocketClient::read(int bytes, char* data); //reads desired amount of bytes and puts them in data, size of data>bytes! 

К сожалению, я не нашел read_byte функцию в Boost.Asio. Я не хочу отбрасывать байты, которые были получены, но еще не прочитаны.

Here is my class.

+0

Из документации, это не очевидно, что происходит с данными, которые я не читал. Мне нужно ** читать число байтов. Точное число. Не более. Не менее. Если есть меньше, функция блокируется. ** Что происходит, когда есть больше, чем мне нужно? ** –

+0

Почему вы не можете просто использовать собственный механизм буферизации? Читайте, что доступно, и если доступно количество байтов в байтах $, возвращайте это количество байтов, иначе читайте больше. – EHuhtala

ответ

6

read функция, кажется, обеспечивают именно то, что вам нужно:

Эта функция используется для чтения определенного количества байт данных из потока. Вызов будет блокироваться, пока один из следующих условий является верно: использование

- The supplied buffers are full. That is, the bytes transferred 
    is equal to the sum of the buffer sizes. 
- An error occurred. 

Пример:

boost::asio::read(stream, boost::asio::buffer(data, size)); 
+0

Где я могу получить поток данных? Это член 'tcp :: socket'? Или я могу использовать здесь экземпляр 'socket'? –

+2

Да, вы можете напрямую использовать сокет. Все, что поддерживает концепцию [SyncReadStream] (http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/SyncReadStream.html), можно использовать здесь –

+0

Я реализовал то же самое, но некоторые как он не возвращает фактический результат и запрос повесился. –

Смежные вопросы