2016-08-16 17 views
0

Ich schreibe eine Client-Server-Demo mit boost.asio. Ich ging durch die http-Demo und schrieb meinen eigenen Code von Grund auf neu. Aber ich bekomme eine Ausnahme (höchstwahrscheinlich), während der Akzeptor initialisiert wird. Ich bin mir nicht sicher, warum ich diese Ausnahme bekomme und mein Beispiel http-Code (von Boost-Site) macht dasselbe und läuft gut.Boost: asio bekomme Ausnahme

Hier ist meine server.h Codebeispiel

#include <boost/asio.hpp> 
#include <boost/noncopyable.hpp> 
#include "Connection.h" 
#include <iostream> 

using boost::asio::ip::tcp; 

class Server : private boost::noncopyable 
{ 
    public: 
    explicit Server(const std::string& address, const std::string& port); 

    void run(); 

    private: 
    boost::asio::ip::tcp::acceptor _acceptor; 
    boost::asio::io_service   _ioService; 
    CONNECTION_SHARED_POINTER  _connection; 

    void start_accept(); 
    void handle_accept(const boost::system::error_code& e); 
    void handle_stop(); 
}; 

server.cpp Code

#include "Server.h" 
#include <boost/bind.hpp> 


Server::Server(const std::string& address, const std::string& port) 
    :_acceptor(_ioService), 
    _connection() 
{ 

    boost::asio::ip::tcp::resolver resolver(_ioService); 
    boost::asio::ip::tcp::resolver::query query(address, port); 
    boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query); 

    _acceptor.open(endpoint.protocol()); 
    _acceptor.set_option(
       boost::asio::ip::tcp::acceptor::reuse_address(true)); 
    _acceptor.bind(endpoint); 
    _acceptor.listen(); 


    //Starting the acceptor 
    start_accept(); 
} 

void Server::run() 
{ 
    std::cout<< "Running ioService" <<std::endl; 
    _ioService.run(); 
} 

void Server::start_accept() 
{ 
    _connection.reset(new Connection(_ioService)); 

    std::cout<< "Accept connection" <<std::endl; 
    _acceptor.async_accept(_connection->socket(), 
         boost::bind( &Server::handle_accept, this, 
             boost::asio::placeholders::error)); 


} 

void Server::handle_accept(const boost::system::error_code& e) 
{ 

    if (!e) 
    { 
     _connection->start(); 
    } 

    start_accept(); 
} 

Und mein main.cpp

#include "Server.h" 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     Server s("0.0.0.0", "7000"); 
     s.run(); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 

Jetzt ist mein Code ein excpetion bekommen innerhalb von Server CTOR, während versucht wird, _acceptor zu initialisieren. Die Fehlermeldung lautet wie folgt:

Unhandled exception at 0x7747d7f6 in VrfServer.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff. 

Stack Dump ist wie folgt:

ntdll.dll!000000007747d7f6() 
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
VrfServer.exe!boost::asio::detail::win_mutex::lock() Line 51 C++ 
VrfServer.exe!boost::asio::detail::scoped_lock<boost::asio::detail::win_mutex>::scoped_lock<boost::asio::detail::win_mutex>(boost::asio::detail::win_mutex & m) Line 47 C++ 
VrfServer.exe!boost::asio::detail::service_registry::do_use_service(const boost::asio::io_service::service::key & key, boost::asio::io_service::service * (boost::asio::io_service &)* factory) Line 108 + 0x12 bytes C++ 
VrfServer.exe!boost::asio::detail::service_registry::use_service<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >() Line 49 C++ 
VrfServer.exe!boost::asio::use_service<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service & ios) Line 34 C++ 
VrfServer.exe!boost::asio::basic_io_object<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::basic_io_object<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service & io_service) Line 91 + 0x36 bytes C++ 
VrfServer.exe!boost::asio::basic_socket_acceptor<boost::asio::ip::tcp,boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::basic_socket_acceptor<boost::asio::ip::tcp,boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service & io_service) Line 86 C++ 
VrfServer.exe!Server::Server(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & address, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & port) Line 8 + 0x76 bytes C++ 
VrfServer.exe!main(int argc, char * * argv) Line 8 + 0x52 bytes C++ 
VrfServer.exe!__tmainCRTStartup() Line 555 + 0x19 bytes C 
VrfServer.exe!mainCRTStartup() Line 371 C 
kernel32.dll!00000000772259bd()  
ntdll.dll!000000007745a2e1()  

Kann jemand irgendein Licht vergießen?

Antwort

1

Das Problem nichts mit Asio zu tun hat, es ist nur, wie C++

In Ihrem Server Klasse arbeitet Sie erklären:

private: 
    boost::asio::ip::tcp::acceptor _acceptor; 
    boost::asio::io_service   _ioService; 
    CONNECTION_SHARED_POINTER  _connection; 

Und dann Sie es wie folgt initialisieren:

Server::Server(const std::string& address, const std::string& port) 
    :_acceptor(_ioService), 
    _connection() 

Wenn Sie _acceptor initialisieren, wurde _ioService noch nicht initialisiert, aufgrund der Reihenfolge der Deklaration in t er Klasse.

boost::asio::io_service   _ioService; 
    boost::asio::ip::tcp::acceptor _acceptor; 
    CONNECTION_SHARED_POINTER  _connection; 

Sollte das Problem lösen.

+0

Wie konnte ich das verpassen! Vielen Dank! – Pixelord

+0

Wenn Sie mit einer höheren Ebene von Warnungen kompilieren, sollte der Compiler Ihnen davon erzählt haben! –