【问题标题】:Will my buffer used by all connections?我的缓冲区会被所有连接使用吗?
【发布时间】:2017-06-07 12:22:13
【问题描述】:

我有一个 main 创建一个 io_service 并将它们传递给 TcpServer 的一个实例。

TcpServer 有一个成员 std::array<char, 8192> m_buffer。它有 4 个方法:构造函数、startAccept、handleAccept 和 handleRead。 构造函数只初始化部分成员,调用startAccept。

startAccept 创建一个共享指针TcpConnection,它扩展了std::enable_shared_from_this<TcpConnection。之后开始 accept 调用 m_acceptor.async_accept 并将 accept 绑定到前面提到的 handleAccept 方法。

这是我的 handleAccept 方法。它使用 boost::asio::buffer 调用 async_read_some,它使用 TcpServer 中声明的成员变量。

void TcpServer::handleAccept(std::shared_ptr<TcpConnection> newConnection, const boost::system::error_code &error)
{
    if (!error) {
        //newConnection->start();

        std::cout << "Accepting new connection" << std::endl;
        newConnection->getSocket().async_read_some(
            boost::asio::buffer(m_buffer),
            boost::bind(&TcpServer::handleRead, this, newConnection, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
        );
    }

    startAccept();
}

我不确定,但是如果有多个连接,它们都会使用同一个缓冲区对象,对吧?他们可能会覆盖它,不是吗?

【问题讨论】:

  • 这取决于buffer 的具体实现,buffer(m_buffer) 的意思是“m_buffer 创建新的buffer”但是谁知道这在实践中是什么意思,使用它的存储?复制它的内容?等
  • 缓冲区是 boost::asio::buffer。我的文件中有一个using boost::asio::buffer;。我编辑了我原来的问题。那么...这会改变我的问题吗?
  • 缓冲区应该在TCPConnection,而不是TCPServer。服务器只有一个接受循环。它不需要缓冲区,但每个连接都需要。

标签: c++ boost-asio shared-ptr


【解决方案1】:

是的,所有连接都将使用相同的缓冲区,该缓冲区在TcpServer 中定义。您实际上应该将缓冲区存储在连接中,而不是在服务器中。

boost::asio::buffer 将使用that overload。因此,读取的数据将存储到您的m_buffer。您应该将buffer 存储在连接中,或者使用一些同步(即一些布尔标志,如is_in_read,但这是个坏主意)。

【讨论】:

  • 好的建议。我会把它们放在 TcpConnection 中。感谢您的快速答复。
猜你喜欢
  • 2017-05-13
  • 2018-07-17
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2016-04-03
  • 1970-01-01
  • 2019-03-10
相关资源
最近更新 更多