我的缓冲区会被所有连接使用吗?
Will my buffer used by all connections?
我有一个创建 io_service
并将它们传递给 TcpServer
.
实例的主程序
TcpServer
有一个成员 std::array<char, 8192> m_buffer
。它有 4 个方法:构造函数、startAccept、handleAccept 和 handleRead。
构造函数只初始化部分成员,调用startAccept.
startAccept 创建一个扩展 std::enable_shared_from_this<TcpConnection
的 TcpConnection
的共享指针。之后开始接受调用 m_acceptor.async_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();
}
我不确定,但是如果有多个连接,它们都会使用同一个缓冲对象,对吧?他们可能会覆盖它,不是吗?
是的,所有连接都将使用在 TcpServer
中定义的相同缓冲区。您实际上应该将缓冲区存储在连接中,而不是服务器中。
boost::asio::buffer
将使用 that overload。因此,读取的数据将存储到您的 m_buffer
。您应该将 buffer
存储在连接中,或使用一些同步(即一些布尔标志,如 is_in_read
,但这是个坏主意)。
我有一个创建 io_service
并将它们传递给 TcpServer
.
TcpServer
有一个成员 std::array<char, 8192> m_buffer
。它有 4 个方法:构造函数、startAccept、handleAccept 和 handleRead。
构造函数只初始化部分成员,调用startAccept.
startAccept 创建一个扩展 std::enable_shared_from_this<TcpConnection
的 TcpConnection
的共享指针。之后开始接受调用 m_acceptor.async_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();
}
我不确定,但是如果有多个连接,它们都会使用同一个缓冲对象,对吧?他们可能会覆盖它,不是吗?
是的,所有连接都将使用在 TcpServer
中定义的相同缓冲区。您实际上应该将缓冲区存储在连接中,而不是服务器中。
boost::asio::buffer
将使用 that overload。因此,读取的数据将存储到您的 m_buffer
。您应该将 buffer
存储在连接中,或使用一些同步(即一些布尔标志,如 is_in_read
,但这是个坏主意)。