Увеличивать адрес массива при асинхронном вызове чтения - PullRequest
1 голос
/ 17 февраля 2012

Можно ли как-нибудь увеличить адрес до boost::array при передаче его в качестве аргумента?

Если быть точным, я предоставляю буфер -> boost::array<char, 4096> buffer.

Этот буфер я передаю вызову socket::async_read_some, чтобы заполнить его.Теперь, когда мой async_read_some заканчивает, буфер не обязательно заполнен (как я могу проверить с помощью bytes_transferred).Теперь, если это произойдет, я хочу снова вызвать async_read_some, чтобы заполнить буфер дальше.

Теперь, если я передам буфер как обычно, он просто перезапишет содержимое в нем.Но я хочу, чтобы функции заполняли буфер в той позиции, где он завершился после первого вызова.К сожалению, я не могу просто передать увеличенный адрес buffer+bytes_transferred, что было бы возможно с обычным буфером char*.

Вот несколько (упрощенных) примеров кода того, что я хочу сделать - пожалуйста, предположите, что всебыл инициализирован и io_service запущен.

void myClass::startRead()
{
    mySocket.async_read_some(boost::asio::buffer(buffer,4096)),
         boost::bind(&myClass::handle_read, shared_from_this(),
               boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void myClass::handle_read(const boost::system::error_code& err ,size_t bytesTransferred)
{
    if ( bytes_transferred < 4096 )
    {
            mySocket.async_read_some(/* address of buffer + bytes_transferred */
                         boost::bind(&myClass::handle_read, shared_from_this(),
                              boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }
}

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

Значит, у кого-нибудь есть помощь, как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

Технически, boost :: array имеет функцию-член c_array (), которая позволяет вам получить доступ к базовому c-массиву.Таким образом, вы можете написать что-то вроде asio::buffer(buffer.c_array() + bytesTransferred, buffer.size() - bytesTransferred))

Но было бы более безопасно использовать asio::streambuf.

0 голосов
/ 18 февраля 2012

Вы можете использовать async_read с заголовком, который содержит размер данных. Затем снова вызовите async_read с размером чтения. Я просто привожу некоторые примеры в другом посте, просто посмотрите .

...