2015-12-01 70 views
0

这是我第一个使用boost::asio的项目,我正在构建一个异步服务器。C++ boost :: asio如何在异步函数上正确使用std :: shared_ptr

我需要使用shared_ptr来控制对session控制指针的访问。这里是I'm做定义了会议,并把它传递给升压异步函数的方式:

// Define the new session object 
std::shared_ptr<SocketSession> session = std::make_shared<SocketSession>(ioService); 

// Configure the acceptor 
acceptor.async_accept(session->getSessionSocket(), 
         boost::bind(&SocketServer::HandleAccept, 
         this, 
         session, 
         boost::asio::placeholders::error)); 

而且处理程序签名:

void SocketServer::HandleAccept(std::shared_ptr<SocketSession> session, 
           const boost::system::error_code& errorCode) 

的代码在所有的编译罚款,没有错误。但是在运行代码时,调用HandleAccept方法的错误为:Operation canceled,甚至没有监听套接字。

它认为这与我使用shrared_ptr的方式有关。我已经通过一些例子,并提高使用shared_from_this。我无法找出为什么这是必要的,以及为什么我的shared_ptr在运行时失败。

帮助赞赏。

注意:此代码在其他服务器类(Server)上运行,而不在会话类(SocketSession)上运行。在我看来,这导致不使用shared_from_this作为SocketSession正在创建另一个对象...

+0

如果你没有,我建议在http://www.boost.org/doc/libs/1_59_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_serv检查'boost :: asio'服务器示例er.cpp –

+0

我已经检查过了,但是增强文档并没有解释为什么它被使用的基本原理 - 它只是说明它是如何使用的。我的概念使用'std :: shared_ptr'看起来是正确的,但我不明白为什么它不能正常工作... – Mendes

+0

@Mendez你是说boost示例不起作用?你是否说过你改变了boost示例的工作方式,它不再有效?如果是这样,你能突出显示你改变了什么吗?或者你是否说你产生了一种新的模式,而这种新模式不起作用?我只是想减少出错的难度。此外,一个最小的自包含编译示例将是有用的。请参阅https://stackoverflow.com/help/mcve – Yakk

回答

1

@Mendez我有几个入门样本,当人们遇到这种“ASIO模式”的要求。

你可以看看他们,因为我做的解释模式,为什么它的介绍:

+0

感谢您的帖子。非常有用,但并不完全符合我尝试去做的事情。在你的文章中你创建了几个服务器。在我的情况下,我有一个服务器和连接请求上创建的几个会话...从帖子我可以更改为会话类来从'enable_shared_from_this'派生,并且原始错误消失...现在我正在对付另一个问题:当由于超时而删除'session'类时,如何处理'server'类......我将在另一个SO线程中发布以澄清。感谢您的帮助。 – Mendes

+0

@Mendez我非常肯定我有多个答案显示你的_exact_情况。我很确定我把他们中的一个联系起来了。但如果你需要更多:https://stackoverflow.com/search?q=user%3A85371+asio+shared_from_this – sehe

相关问题