我的缓冲区是否会被所有连接使用?

时间:2017-06-07 12:22:13

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

我有一个创建io_service的主人,并将其传递给TcpServer的实例。

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

startAccept创建TcpConnection的共享指针,扩展std::enable_shared_from_this<TcpConnection。在那之后,接受调用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();
}

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

1 个答案:

答案 0 :(得分:3)

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

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