我正在尝试用于异步web socket server - client的Boost Beast示例
我正在运行服务器和客户端,如下所示:
server.exe 127.0.0.1 4242 1
client.exe 127.0.0.1 4242 "Hello"
如果一切正常,我相信它应该会在服务器命令提示符上打印"Hello“
下面是代码
void
on_read(
beast::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
// This indicates that the session was closed
if (ec == websocket::error::closed)
return;
if (ec)
fail(ec, "read");
// Echo the message
ws_.text(ws_.got_text());
std::cout << "writing received value " << std::endl;
ws_.async_write(
buffer_.data(),
beast::bind_front_handler(
&session::on_write,
shared_from_this()));
std::cout << buffer_.data().data()<< std::endl;
}ws_.write()没有在控制台上写任何东西,但是buffer_data.data()呈现00000163E044EE80
我如何确保这是正常工作的?如何从套接字缓冲区检索字符串值?
发布于 2019-07-20 02:25:57
除了在使用buffer之前使用buffer之外,为了转换buffer,我还必须编写to_string_函数,该函数接受平面缓冲区并返回字符串
std::string to_string_(beast::flat_buffer const& buffer)
{
return std::string(boost::asio::buffer_cast<char const*>(
beast::buffers_front(buffer.data())),
boost::asio::buffer_size(buffer.data()));
};发现beast::buffers_to_string(buffer_.data())也可以很容易地做到这一点。
发布于 2019-07-19 23:55:44
发送消息的行打印内容应放在async_write之前
std::cout << buffer_.data().data()<< std::endl;
ws_.async_write(
buffer_.data(),
beast::bind_front_handler(
&session::on_write,
shared_from_this()));为什么?
BOOST-ASIO/BEAST中所有以async_开头的函数都会立即返回。它们发起一些任务,这些任务在后台asio核心中执行,当它们准备好时,处理程序被调用。
看看on_write处理程序:
void
on_write(
beast::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
if (ec)
return fail(ec, "write");
// Clear the buffer
buffer_.consume(buffer_.size()); /// <---consume从buffer_的开头删除长度为buffer_size的字节块。
您的问题是缓冲区可能已被清除,然后打印出来:
thread 1 thread 2
------------------------------ | steps
async_write | | [1]
| consume | [2]
cout << buffer_ | | [3]
| https://stackoverflow.com/questions/57114550
复制相似问题