boost::asio buffer impossible to convert parameter from char to const mutable_buffer&
Posted
by Ekyo777
on Stack Overflow
See other posts from Stack Overflow
or by Ekyo777
Published on 2010-06-10T06:49:16Z
Indexed on
2010/06/10
6:52 UTC
Read the original article
Hit count: 465
visual studio tells me "error C2664: 'boost::asio::mutable_buffer::mutable_buffer(const boost::asio::mutable_buffer&)': impossible to convert parameter 1 from 'char' to 'const boost::asio::mutable_buffer&' at line 163 of consuming_buffers.hpp"
I am unsure of why this happen nor how to solve it(otherwise I wouldn't ask this ^^') but I think it could be related to those functions.. even tough I tried them in another project and everything worked fine... but I can hardly find what's different
so... here comes code that could be relevant, if anything useful seems to be missing I'll be glad to send it.
packets are all instances of this class.
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*);
};
this sends a given packet
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);
}
this enable reading packets and calls a function that decodes the packet's header(unsigned short) and resize the buffer to send it to another function that reads the real data from the packet
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)));
}
and this is called by async_read once a packet is received
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));
}
}
© Stack Overflow or respective owner