Как использовать std :: string с asio :: buffer ()

Когда я пытаюсь использовать std :: string с boost :: asio :: buffer, я получаю следующее сообщение об ошибке:

boost/asio/detail/consuming_buffers.hpp:
In constructor
'boost::asio::detail::consuming_buffers<
        boost::asio::mutable_buffer, boost::asio::const_buffers_1
    >::consuming_buffers(const boost::asio::const_buffers_1 &)':
boost/asio/impl/read.hpp:140:25:  
instantiated from
'boost::asio::detail::read_op<
        boost::asio::basic_stream_socket<boost::asio::ip::tcp>,
boost::asio::const_buffers_1
      , boost::asio::detail::transfer_all_t
      , boost::_bi::bind_t<
            void, boost::_mfi::mf1<void, read_op, const
boost::system::error_code &>
          , boost::_bi::list2<boost::_bi::value<read_op
*>, boost::arg<1> (*)()> 
        > 
    >::read_op(
        boost::asio::basic_stream_socket<boost::asio::ip::tcp>
&, const boost::asio::const_buffers_1
&
      , boost::asio::detail::transfer_all_t
      , boost::_bi::bind_t<
            void, boost::_mfi::mf1<void, read_op, const
boost::system::error_code &>
          , boost::_bi::list2<boost::_bi::value<read_op
*>, boost::arg<1> (*)()>
        >
    )'

[...]

Полный исходный код: http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86


person niXman    schedule 01.11.2010    source источник
comment
посмотрите на это, если вам спустя 2 года все еще интересно: stackoverflow.com/questions/2790383/   -  person NoSenseEtAl    schedule 31.07.2012


Ответы (3)


Я думаю, проблема в том, что вы передаете константный буфер в async_read вместо изменяемого буфера. В блоке, заканчивающемся строкой 50, boost::asio::buffer(_header) возвращает константный буфер. Вам следует сделать что-то вроде boost::asio::async_read(s, boost::asio::buffer(data, size), handler), потому что boost::asio::buffer(data, size) создает изменяемый буфер.

Вместо использования std::strings для _header и _data вам, вероятно, потребуется использовать массивы символов, например:

char* _data;
boost::asio::buffer(_data, strlen(_data));

См. Справочную документацию для buffer и async_read.

person rturrado    schedule 01.11.2010
comment
Я почти уверен, что std :: strings можно назначить массивам char *, и можно экспортировать массив char * из std :: string с помощью std :: string.c_str () - person Tom Johnson; 25.04.2011
comment
std::string::c_str() возвращает const char*, а не char*. Его можно использовать только с const_buffer. - person Benjamin Buch; 28.02.2018

Вы должны передать указатель в качестве первого параметра:

#include <string>
#include <boost/asio.hpp>

std::string request, reply;
auto rsize = boost::asio::buffer(&reply[0], request.size());
person xunzhang    schedule 21.05.2016
comment
Отметим, что до C ++ 11 это не обязательно правильно. До C ++ 11 не гарантировалось, что массив символов, содержащийся в std :: string, будет непрерывным, что требуется для boost :: asio :: buffer. На практике каждый компилятор использует непрерывный блок памяти, и поэтому это стало обязательным поведением в C ++ 11. - person Eldritch Cheese; 06.09.2016

Из boost::asio::buffer справочной документации:

Кажется, что std::string можно было передать в asio::buffer только как константную ссылку.

std::vector<char> должна быть лучшей альтернативой:

std::vector<char> d2(128);
bytes_transferred = sock.receive(boost::asio::buffer(d2));
person Gang Yin    schedule 05.07.2012