буфер boost :: asio невозможно преобразовать параметр из char в const mutable_buffer & - PullRequest
2 голосов
/ 10 июня 2010

visual studio сообщает мне "ошибка C2664: 'boost :: asio :: mutable_buffer :: mutable_buffer (const boost :: asio :: mutable_buffer &)': невозможно преобразовать параметр 1 из 'char' в 'const boost :: asio :: mutable_buffer & 'в строке 163 consuming_buffers.hpp "

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

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

пакеты - все экземпляры этого класса.

class CPacketBase
{
protected:
 const unsigned short _packet_type;
 const size_t _size;
 char* _data;

public:
 CPacketBase(unsigned short packet_type, size_t size);
 ~CPacketBase();

 size_t get_size();
 const unsigned short& get_type();
 virtual char* get();
 virtual void set(char*);
};

отправляет данный пакет

    template <typename Handler> 
 void async_write(CPacketBase* packet, Handler handler)
 {
  std::string outbuf;
  outbuf.resize(packet->get_size());
  outbuf = packet->get();
  boost::asio::async_write( _socket
   , boost::asio::buffer(outbuf, packet->get_size())
   , handler);
 }

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

template <typename Handler> 
 void async_read(CPacketBase* packet, Handler handler)
 {
  void (CTCPConnection::*f)( const boost::system::error_code&
      , CPacketBase*, boost::tuple<Handler>)
       = &CTCPConnection::handle_read_header<Handler>;
  boost::asio::async_read(_socket, _buffer_data
   , boost::bind( f
    , this
    , boost::asio::placeholders::error
    , packet
    , boost::make_tuple(handler)));
 }

и вызывается async_read после получения пакета

template <typename Handler> 
 void handle_read_header(const boost::system::error_code& error, CPacketBase* packet, boost::tuple<Handler> handler)
 {
  if (error)
  {
   boost::get<0>(handler)(error);
  }
  else
  {
   // Figures packet type
   unsigned short packet_type = *((unsigned short*) _buffer_data.c_str());

   // create new packet according to type
   delete packet;
   ...

   // read packet's data
   _buffer_data.resize(packet->get_size()-2); // minus header size

   void (CTCPConnection::*f)( const boost::system::error_code&
     , CPacketBase*, boost::tuple<Handler>)
       = &CTCPConnection::handle_read_data<Handler>;
   boost::asio::async_read(_socket, _buffer_data
    , boost::bind( f
     , this
     , boost::asio::placeholders::error
     , packet
     , handler));
  }
 }

1 Ответ

3 голосов
/ 10 июня 2010

На основе этой строки кода ...

unsigned short packet_type = *((unsigned short*) _buffer_data.c_str());

... Я предполагаю, что вы используете std::string в качестве типа для _buffer_data и пытаетесь прочитать данные в него, используя boost::asio::async_read. Вы не можете сделать это (см. Мой ответ здесь для объяснения: Как асинхронно читать в std :: string, используя Boost :: asio? )

Вы можете попробовать использовать одну из фабричных перегрузок boost::asio::buffer и использовать тип POD, например char *. Например:

char * _buffer_data = new char[packet->get_size()-2];
boost::asio::async_read(
    _socket, 
    boost::asio::buffer(_buffer_data, packet->get_size()-2), 
    //....

(Я не проверял это, но теоретически он должен создать изменяемый буфер, обертывающий массив необработанных символов, который имеет не более packet->get_size()-2 байтов. Имеет смысл ...)

Вы также можете попробовать использовать boost::shared_array<char> вместо этого, но я не уверен, что он также может быть неявно преобразован в изменяемый буфер, так что вам придется свернуть свой собственный "изменяемый буфер". Обратите внимание, что, поскольку boost::asio::async_read является функцией шаблона, тип второго параметра не является строго определенным и может фактически быть чем угодно, что соответствует изменяемым буферам concept . Смотрите эту страницу для получения дополнительной информации об этом: http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/MutableBufferSequence.html

...