Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
Boost-Beast async web socket Server-Client async read-write not writing output on console
我正在尝试异步Web套接字服务器的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
如何确保它工作正常?如何从套接字缓冲区检索字符串值?
已发送消息的行打印内容应放在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]
|
除了在使用缓冲区之前使用缓冲区外,为了转换缓冲区,我必须编写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())
来完成。
参考 : 试图理解助推兽-多缓冲
相关文章:
- C++:将控制台输出存储在宏中更好吗
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- C++控制台应用程序阻止退出
- 如何修复此iFile以将.txt输出到控制台
- 为什么控制台要求输入,即使代码中没有输入
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 控制台输出在 Qt5 中未正确显示
- C++出现控制台错误.我无法识别源代码的问题
- C++程序不会从 Windows 控制台运行
- 如何在C++中实现带有packaged_task的异步等待循环?
- 有人可以向我解释为什么控制台输出 0 吗?
- 创建 Spdlog 异步文件记录器时遇到困难
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- Win32 API 控制台光标在 WriteConsole 后不移动
- C ++异步键盘输入(标准方式)
- 如何获取控制台窗口的宽度?
- 异步控制台输入冻结了以前的输入 C