首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启动asio http服务器,如何停止?

问启动asio http服务器,如何停止?
EN

Stack Overflow用户
提问于 2014-08-17 11:59:09
回答 1查看 1.2K关注 0票数 5

我正在使用boost附带的一个示例http服务器(在doc/html/boost_asio/example/cpp03/http/server,上,或者在http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp03_examples.html#boost_asio.examples.cpp03_examples.http_server上)。

该示例打开接受器套接字并侦听,剥离对请求对象的请求。服务器还有一个boost asio signal_set,当接收到SIGINT或SIGTERM时,它会注册信号处理程序并取消io_service中的所有asio请求。按CTRL-C组合键并收到信号后,io_service将调用handle_stop()函数,然后该函数将在所有asio::ip::tcp::sockets上调用.close()。整个服务器正常关闭,io_service.run()调用退出,程序结束。

我希望能够在线程中启动此http服务器,然后以编程方式取消它,而不是使用信号。可接受的方法是什么?我删除了signal_set和信号处理程序,然后在另一个线程上启动了服务器。它可以很好地处理来自新线程的http请求。我如何从另一个线程停止它?从不同的线程调用asio::ip::tcp::socket::close()安全吗?文档并不清楚,只是这样做感觉非常,非asio-ish。事实上,当我尝试这样做时,只要我还没有接受任何http请求,它就会工作得很好。如果我处理了一个单独的http请求,这个过程就会在boost中崩溃:

代码语言:javascript
复制
>   test_ssl_server_sa.exe!boost::detail::sp_counted_base::add_ref_lock()  Line 81 + 0x3 bytes  C++
    test_ssl_server_sa.exe!boost::detail::shared_count::shared_count(const boost::detail::weak_count & r={...})  Line 578 + 0x12 bytes  C++
    test_ssl_server_sa.exe!boost::shared_ptr<http::server::connection>::shared_ptr<http::server::connection><http::server::connection>(const boost::weak_ptr<http::server::connection> & r={...})  Line 405 + 0x3f bytes    C++
    test_ssl_server_sa.exe!boost::enable_shared_from_this<http::server::connection>::shared_from_this()  Line 49 + 0xc bytes    C++
    test_ssl_server_sa.exe!http::server::connection::handle_handshake(const boost::system::error_code & error={...})  Line 83 + 0x11 bytes  C++
    test_ssl_server_sa.exe!boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>::operator()(http::server::connection * p=0x004b8fe8, const boost::system::error_code & a1={...})  Line 165 + 0x18 bytes    C++
    test_ssl_server_sa.exe!boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> >::operator()<boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list1<boost::system::error_code const &> >(boost::_bi::type<void> __formal={...}, boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &> & f={...}, boost::_bi::list1<boost::system::error_code const &> & a={...}, boost::_bi::type<void> __formal={...})  Line 314    C++
    test_ssl_server_sa.exe!boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > >::operator()<boost::system::error_code>(const boost::system::error_code & a1={...})  Line 48  C++
    test_ssl_server_sa.exe!boost::asio::ssl::detail::handshake_op::call_handler<boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >(boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > & handler={...}, const boost::system::error_code & ec={...}, const unsigned int & __formal=0)  Line 55    C++
    test_ssl_server_sa.exe!boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >::operator()(boost::system::error_code ec={...}, unsigned int bytes_transferred=0, int start=0)  Line 276   C++
    test_ssl_server_sa.exe!boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int>::operator()()  Line 129   C++
    test_ssl_server_sa.exe!boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int> >(boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int> & function={...}, ...)  Line 70 C++
    test_ssl_server_sa.exe!boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int>,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >(boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int> & function={...}, boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > & context={...})  Line 37 + 0x16 bytes   C++
    test_ssl_server_sa.exe!boost::asio::ssl::detail::asio_handler_invoke<boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int>,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >(boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int> & function={...}, boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > > * this_handler=0x00fefb70)  Line 319 + 0x10 bytes  C++
    test_ssl_server_sa.exe!boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int>,boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > > >(boost::asio::detail::binder2<boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > >,boost::system::error_code,unsigned int> & function={...}, boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > > & context={...})  Line 37 + 0x16 bytes   C++
    test_ssl_server_sa.exe!boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1,boost::asio::ssl::detail::io_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ssl::detail::handshake_op,boost::_bi::bind_t<void,boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>,boost::_bi::list2<boost::_bi::value<http::server::connection *>,boost::arg<1> > > > >::do_complete(boost::asio::detail::task_io_service * owner=0x00c1aca0, boost::asio::detail::task_io_service_operation * base=0x00c1f948, const boost::system::error_code & __formal={...}, const boost::system::error_code & __formal={...})  Line 110 + 0xd bytes    C++
    test_ssl_server_sa.exe!boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service & owner={...}, const boost::system::error_code & ec={...}, unsigned int bytes_transferred=0)  Line 38 + 0x1a bytes C++
    test_ssl_server_sa.exe!boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::win_mutex> & lock={...}, boost::asio::detail::task_io_service_thread_info & this_thread={...}, const boost::system::error_code & ec={...})  Line 386  C++
    test_ssl_server_sa.exe!boost::asio::detail::task_io_service::run(boost::system::error_code & ec={...})  Line 153 + 0x1e bytes   C++

我并不是说服务器可能没有不同的同步问题--特别是,看起来服务器在boost::shared_ptr上多次访问connection对象时崩溃了。但我更感兴趣的是,关闭来自另一个线程的io_service.run()调用的正确方法是什么。当我想象这是如何工作的时候,我想象了一个等待控制变量的io_service请求。如果我想关闭服务器,我会从另一个线程向控制变量发送信号,然后io_service将在io_service线程上调用我的回调。从那里,它可以.close()任何套接字或以其他方式取消任何其他正在进行的请求。

EN

回答 1

Stack Overflow用户

发布于 2016-09-29 05:22:54

您可以将boost::asio::io_service::post与试图停止http服务器的线程中的lambda一起使用。lambda将在http服务器线程中执行。它可以在所有套接字上安全地调用socket::close。这将优雅地停止该服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25346208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档