boost::asio асинхронное ожидание данных на сокете
class Socket : public std::enable_shared_from_this<Socket>
{
public:
Socket(boost::asio::io_context& ioContex)
: m_socket(ioContex)
{
}
void start()
{
auto readHandler = std::bind(&Socket::onRead,
shared_from_this(),
std::placeholders::_1,
std::placeholders::_2);
boost::asio::async_read(m_socket, boost::asio::buffer(m_socketBuf), std::move(readHandler));
}
private:
void onRead(const boost::system::error_code& error, size_t msgSize)
{
if (msgSize != 0)
{
parseBuf();
m_socketBuf.clear();
}
start();
}
private:
boost::asio::ip::tcp::socket m_socket;
std::string m_socketBuf;
};
//using
boost::asio::io_context ioContex;
auto socketPtr = std::make_shaed<Socket>(ioContex);
socketPtr->start();
ioContex.run();
Как правильно ожидать данные на сокете асинхронно?
В приведенном примере onRead(...) вызывается бесконечно с нулевым msgSize
Ответы (1 шт):
Автор решения: Ivan Sodorenko
→ Ссылка
Проблема оказалась в нулевом размере приемного буфера.
void start()
{
m_socketBuf.resize(1024); // here
auto readHandler = std::bind(&Socket::onRead,
shared_from_this(),
std::placeholders::_1,
std::placeholders::_2);
boost::asio::async_read(m_socket, boost::asio::buffer(m_socketBuf), std::move(readHandler));
}