libpion服务器在请求处理时崩溃

时间:2016-03-31 16:56:24

标签: c++ boost server boost-asio

我使用以下版本的库:libpion-dev 5.0.6 libboost-all-dev 1.58.0在Internet上找到了一个异步HTTP服务器的简单示例,但它属于处理请求的描述了处理程序。此外,对于不存在的资源,正确返回404响应。

服务器代码:我使用以下版本的库:libpion-dev 5.0.6 libboost-all-dev 1.58.0在Internet上找到了一个异步HTTP服务器的简单例子,但它处于描述处理程序的请求。此外,对于不存在的资源,正确返回404响应。

服务器代码:

#include <boost/bind/arg.hpp>
#include <boost/bind/bind.hpp>
#include <boost/bind/placeholders.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <pion/http/parser.hpp>
#include <pion/http/request.hpp>
#include <pion/http/response_writer.hpp>
#include <pion/http/server.hpp>
#include <pion/tcp/connection.hpp>
#include <unistd.h>

struct fake_server {
    void start() {
        m_server = pion::http::server_ptr(new pion::http::server(8080));
        m_server->add_resource("/test", boost::bind(&fake_server::handle_request, this, _1, _2));
        m_server->start();
    }

    void handle_request(pion::http::request_ptr& _httpRequest, pion::tcp::connection_ptr& _tcpConn) {

        pion::http::response_writer_ptr writer(
                pion::http::response_writer::create(
                _tcpConn,
                *_httpRequest,
                boost::bind(&pion::tcp::connection::finish, _tcpConn)));
        pion::http::response& r = writer->get_response();
        writer->write("hello world");
        writer->send();
    }

    pion::http::server_ptr m_server;
};

int main() {

    fake_server svr;
    svr.start();

    for(;;) sleep(86400);
}

堆坏了,已经崩溃了:

Thread #9 [TEST_pion] 16903 [core: 0] (Suspended : Signal : SIGSEGV:Segmentation fault) 
    boost::asio::detail::reactive_socket_service_base::start_op() at reactive_socket_service_base.ipp:219 0x412918  
    boost::asio::detail::reactive_socket_service_base::async_send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at reactive_socket_service_base.hpp:216 0x41a79e  
    boost::asio::stream_socket_service<boost::asio::ip::tcp>::async_send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at stream_socket_service.hpp:330 0x41a79e  
    boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::async_write_some<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at basic_stream_socket.hpp:732 0x41a79e 
    boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> >::operator() at write.hpp:181 0x41a79e   
    boost::asio::async_write<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::function2<void, boost::system::error_code const&, unsigned long>&>() at write.hpp:621 0x41acc6   
    pion::tcp::connection::async_write<std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::function2<void, boost::system::error_code const&, unsigned long> >() at connection.hpp:567 0x41ca4c   
    pion::http::writer::send_more_data<boost::function2<void, boost::system::error_code const&, unsigned long> >() at writer.hpp:277 0x41ca4c   
    pion::http::writer::send() at writer.hpp:167 0x41cf8f   
    fake_server::handle_request() at TEST_pion.cpp:28 0x41cf8f  
    boost::function2<void, boost::shared_ptr<pion::http::request>&, boost::shared_ptr<pion::tcp::connection>&>::operator()(boost::shared_ptr<pion::http::request>&, boost::shared_ptr<pion::tcp::connection>&) const at 0x7ffff6e8a5c9  
    pion::http::server::handle_request() at 0x7ffff6e8516b  
    boost::function3<void, boost::shared_ptr<pion::http::request>, boost::shared_ptr<pion::tcp::connection>, boost::system::error_code const&>::operator()(boost::shared_ptr<pion::http::request>, boost::shared_ptr<pion::tcp::connection>, boost::system::error_code const&) const at 0x7ffff6e8a25c  
    pion::http::request_reader::finished_reading() at 0x7ffff6e8a3bb    
    pion::http::reader::consume_bytes() at 0x7ffff6e830ec   
    pion::http::reader::consume_bytes() at 0x7ffff6e8374d   
    boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::_bi::bind_t<void, boost::_mfi::mf2<void, pion::http::reader, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<boost::shared_ptr<pion::http::request_reader> >, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete at 0x7ffff6e8810b    
    boost::asio::detail::epoll_reactor::descriptor_state::do_complete() at 0x7ffff6e55a84   
    pion::scheduler::process_service_work() at 0x7ffff6e41de1   
    0x7ffff7bc3bc5  
    start_thread() at pthread_create.c:333 0x7ffff5d446aa   
    clone() at clone.S:109 0x7ffff6269e9d   

在此示例中,请求http://127.0.0.1:8080/none返回404而不会崩溃,http://127.0.0.1:8080/test会导致崩溃。我无法理解,原因是什么以及如何正确行事。图书馆没有文件,可能没有考虑到。请帮忙。

2 个答案:

答案 0 :(得分:0)

我不是中介图书馆的专家。但是,/none的请求在没有崩溃的情况下返回404的原因是因为它pion库而不是handle_request函数处理它。

有一个使用pion库here的例子。它可以帮助您发现handle_request函数中出现的问题。

答案 1 :(得分:0)

我找到了这个问题,因为我也遇到了这个问题。

在我看来,Boost和Pion DLL之间的Boost编译时选项不同。具体来说,选项BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG在一个版本中已启用,而在另一个版本中已禁用。这导致boost :: posix_time :: ptime两者之间的大小不同,因此当我跨越DLL边界时,内存将停止映射到适当的成员。

对于我来说,解决方法是使编译时间选项保持一致。

相关问题