Проблема с отправкой данных.async_write()
заканчивается немедленно, он не создает копию буфера данных, вы должны убедиться, что данные, переданные в boost::asio::buffer
, будут действовать до тех пор, пока не будет отправлено полное сообщение.
Даже если мы добавили некоторый код задержки между async_write
и конечной скобкой {
:
async_write(boost::asio::buffer((void *) jsonMsg.toStyledString().data(), ..));
... some code waiting until write is completed
}
, этот код также не будет работать, поскольку toStyledString
возвращает string
по значению .Таким образом, создается временный string
, вызывается string::data()
, async_write()
заканчивается, и у вас есть висящий указатель внутри задачи, инициируемой async_write()
.
Быстрое решение, продлевайте время жизни строки, например, с помощью smartуказатель:
std::shared_ptr<std::string> buf(std::make_shared<std::string>(jsonMsg.toStyledString()));
ws_->async_write(boost::asio::buffer(*buf),
boost::asio::bind_executor(*strand_,
[&, sp, buf](boost::system::error_code ec1,
std::size_t bytes_transferred1)
{
boost::ignore_unused(bytes_transferred1);
if (ec1) {
LOG_ERR << "async write failed, ec = " << ec1 << ", msg = "
<< ec1.message();
return;
}
// Clear the buffer
buffer_->consume(buffer_->size());
task();
}));
передать buf
на boost::asio::buffer(*buf)
и захватить его по значению внутри лямбды: [&,sp,buf]
.