我正在使用 boost::asio用于创建全双工服务器的库。我想知道这种情况是否可能发生。
- 收到一个存储在其自己的缓冲区中的请求。
- 我将响应数据填充到它自己的缓冲区中。
- 我开始异步发送响应。
- 收到新请求。
- 我将响应数据填充到上次填充的同一个缓冲区中。
- 尚未完成的先前写入操作的缓冲区已被新的响应数据损坏。
问题是我是否需要为每个写操作单独的缓冲区,或者在第 3 点中缓冲区被复制到某种内部缓冲区中,我可以安全地将新响应填充到同一个缓冲区中?
最佳答案
boost::asio 能够进行全双工操作,但您应该小心管理缓冲区。
一般规则是:
- 给定套接字上一次只能进行 1 个读取操作。
- 写操作相同
因此您可以同时进行 1 次写入和 1 次读取操作。
您描述的情况应该在单线程环境中工作,因为进程不能同时添加到缓冲区并将其用于写入。但是,有一个技巧:在您附加到写入缓冲区之后,您无法知道当前的 async_write 是否完成。您是否需要启动新的 async_write?这个时刻需要仔细验证。
附言不,asio 从不在内部复制缓冲区。
关于c++ - 这是使用 boost::asio 进行全双工通信的真实场景吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508467/