2016-08-16 8 views
0

私はboost.asioを使ってクライアントサーバーのデモを書いています。 私はhttpデモを見て、自分のコードを一から書きました。 しかし、アクセプタが初期化されている間に例外が発生している可能性があります。なぜ私はこの例外と私の例のHTTPコード(ブーストサイトから)を取得しているのかわからない同じことをやっているとうまく動作しています。ここでブースト:asio取得例外

は私server.hのコードサンプルで、

#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コード

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

そして、私の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; 
} 

今、私のコードはexcpetionを得ていますサーバーCTOR内で、_acceptorを初期化するtryigを実行します。エラーメッセージは次のとおりです:次のように

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

スタックダンプは次のとおりです。

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()  

誰もが任意の光を当てることができますか?

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

を、次のように、あなたはそれを初期化します:C++はあなたのServerクラスで

の作品どれだけ

答えて

1

問題はASIOとは何の関係もありません、それはあなたが宣言だ

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

_acceptorを初期化すると、_ioServiceはまだ初期化されていません。なぜなら、t彼はクラスです。

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

この問題を解決する必要があります。

+0

どうすればそれを逃すことができますか?ありがとう! – Pixelord

+0

より高いレベルの警告でコンパイルすると、コンパイラはそれについてあなたに言ったでしょう! –

関連する問題