c++ - 这是使用 boost::asio 进行全双工通信的真实场景吗?

标签 c++ boost boost-asio

我正在使用 boost::asio用于创建全双工服务器的库。我想知道这种情况是否可能发生。

  1. 收到一个存储在其自己的缓冲区中的请求。
  2. 我将响应数据填充到它自己的缓冲区中。
  3. 我开始异步发送响应。
  4. 收到新请求。
  5. 我将响应数据填充到上次填充的同一个缓冲区中。
  6. 尚未完成的先前写入操作的缓冲区已被新的响应数据损坏。

问题是我是否需要为每个写操作单独的缓冲区,或者在第 3 点中缓冲区被复制到某种内部缓冲区中,我可以安全地将新响应填充到同一个缓冲区中?

最佳答案

boost::asio 能够进行全双工操作,但您应该小心管理缓冲区。

一般规则是:

  1. 给定套接字上一次只能进行 1 个读取操作。
  2. 写操作相同

因此您可以同时进行 1 次写入和 1 次读取操作。

您描述的情况应该在单线程环境中工作,因为进程不能同时添加到缓冲区并将其用于写入。但是,有一个技巧:在您附加到写入缓冲区之后,您无法知道当前的 async_write 是否完成。您是否需要启动新的 async_write?这个时刻需要仔细验证。

附言不,asio 从不在内部复制缓冲区。

关于c++ - 这是使用 boost::asio 进行全双工通信的真实场景吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508467/

相关文章:

c++ - 在 Visual Studio 2010 C/C++ 中, "Rescan Solution"操作的作用是什么?

c++ - 如何正确解除分配或删除 C++ vector ?

c++ - 如何在 C++ 的二维 map 中使用 std::insert?

c++ - 使用 boost::filesystem 遍历目录而不抛出异常

c++ - 使用 SMTP 协议(protocol)和 boost 库发送电子邮件

c++ - 用于 ASIO 写入的十六进制字符串到字节

c++ - 将没有默认构造函数的类设为另一个类的私有(private)属性

c++ - 返回对类变量的引用 - C++

C++ Boost read_json 崩溃,我有#define BOOST_SPIRIT_THREADSAFE

c++ - "spamming"boost::property_tree::read_json 时发生访问冲突