【发布时间】: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