2016-03-31 9 views
0

ich die folgenden Versionen der Bibliotheken verwenden: libpion-dev 5.0.6 libboost-all-dev 1.58.0 Im Internet ein einfaches Beispiel eines asynchronen HTTP-Server nicht gefunden, aber es fällt in der Verarbeitung von Anfragen, für die der Handler beschrieben wird. Bei nicht vorhandenen Ressourcen wird die 404-Antwort korrekt zurückgegeben.Server mit libpion auf Anfrage Absturz Umgang

Server-Code: Ich verwende die folgenden Versionen der Bibliotheken: libpion-dev 5.0.6 libboost-all-dev 1.58.0 Im Internet gefunden ein einfaches Beispiel für einen asynchronen HTTP-Server, aber es fällt in die Verarbeitung von Anfragen, für die der Behandler beschrieben wird. Bei nicht vorhandenen Ressourcen wird die 404-Antwort korrekt zurückgegeben.

Server Code:

#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); 
} 

Stapel threas, die abgestürzt war:

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 

In diesem Beispiel wird die Anfrage http://127.0.0.1:8080/none 404 ohne Absturz zurückgibt, und http://127.0.0.1:8080/test abstürzen. Ich kann nicht verstehen, was der Grund ist und wie man es richtig macht. Bibliothek haben keine Dokumentation, vielleicht etwas nicht berücksichtigt. Bitte helfen Sie.

Antwort

0

Ich bin kein Experte in der Pion-Bibliothek. Doch der Grund, warum die Anforderung an /none 404 zurück, ohne abzustürzen, da sie von der pion Bibliothek nicht durch die handle_request Funktion behandelt hat wird.

Es ist ein Beispiel here die Pion-Bibliothek zu verwenden. Es kann Ihnen helfen, zu entdecken, was in der handle_request Funktion falsch läuft.

Verwandte Themen