我有一个提升asio服务器应用程序,我正在努力如何传输创建的套接字(例如,将接受套接字传输到将在未来读取/写入数据的协议实现类)
例如,如果我将它们通过shared_ptr传输到读取/写入它们的不同类,则可以解决这个问题。我的服务器在退出主程序之前有一个io_service.run(),并且在那里执行了对这些套接字执行的所有异步操作。
编辑我发现问题不是我传输套接字类的方式。可以在课堂上保留这些内容的所有权,并将参考传递到路上。在我的情况下,其中一个连接类在异步操作处理程序完成其工作之前被销毁。
答案 0 :(得分:1)
我认为这个问题实际上与asio无关,可以通用化为“我应该如何转让已分配对象的所有权?”。
我的答案是:使用std::unique_ptr
(...对于C ++ 11)
如果unique_ptr
的接收者想要使用其他所有权习惯用法(例如shared_ptr
),则很容易从unique_ptr
释放并将其转换为shared_ptr
。反之则不然。这样,你的指针就没有时间可以被泄露了。
答案 1 :(得分:1)
如果我正确理解你的问题,我使用共享指针来存储数据并将其传递给asio处理程序。这是UDP接收示例,但传输的概念也相同。 (警告这是从内存写入并且未编译的)
typedef std::vector<uint8_t> DATA_BUF_T;
typedef boost::shared_ptr<DATA_BUF_T> DATA_BUF_PTR_T;
void start_reading ()
{
boost::asio::ip::udp::endpoint listen_endpoint (localAddr, usPort);
m_socket.open (listen_endpoint.protocol());
m_socket.bind (listen_endpoint);
// create buffer to store received data
DATA_BUF_PTR_T db (new DATA_BUF_T (max_length));
m_socket.async_receive_from (
boost::asio::buffer (*db, max_length), m_Status.peer,
boost::bind (&handle_receive_from, this,
db,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);
}
void handle_receive_from (DATA_BUF_PTR_T db,
const boost::system::error_code &error,
size_t bytes_recvd)
{
if (error)
{
return ;
}
// read data from db
}