boost :: asio buffer无法将参数从char转换为const mutable_buffer&

时间:2010-06-10 06:49:16

标签: c++ boost buffer boost-asio

visual studio告诉我“错误C2664:'boost :: asio :: mutable_buffer :: mutable_buffer(const boost :: asio :: mutable_buffer&)':无法将参数1从'char'转换为'const boost :: ASIO :: mutable_buffer和放大器;”在consume_buffers.hpp的第163行“

我不确定为什么会发生这种情况,也不知道如何解决它(否则我不会问这个^^')但我认为它可能与那些功能有关..甚至很难我在另一个项目中尝试过它们一切正常好......但我几乎找不到什么不同

所以...这里有代码可能是相关的,如果有什么有用的东西似乎丢失了我会很高兴发送它。

数据包都是此类的所有实例。

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 个答案:

答案 0 :(得分:3)

基于这行代码...

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

...我猜你使用std::string作为_buffer_data的类型并尝试使用boost::asio::async_read将数据读入其中。你不能这样做(请参阅我的答案以获得解释:How to asynchronously read to std::string using 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个字节的原始char数组。这很有意义......)

您也可以尝试使用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