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));
}
}