2011-05-24 23 views
0
Server::Server(boost::asio::io_service& io_service,std::string ip,short port,std::shared_ptr<ConnectionFactory> factory) 
    : acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(ip.data()), port)){ 

     m_factory = factory; 
     start_accept(); 

     std::cout<<"Socket accepting connections..."<<std::endl; 
} 

void Server::start_accept(){ 
    boost::asio::io_service io_service; 
    std::shared_ptr<Connection> conn = m_factory->create(io_service); 

    acceptor_.async_accept(conn->socket(), 
     boost::bind(&Server::handle_accept, this,conn, 
      boost::asio::placeholders::error)); 

} 


void Server::handle_accept(std::shared_ptr<Connection> conn,const boost::system::error_code& error){ 

    if (!error) 
    { 
     std::cout<<"on connected"<<std::endl; 
     conn->OnConnected(); 
     start_accept(); 
    } 
    } 

當我運行該項目,我獲得以下錯誤:升壓async_accept導致「訪問衝突」 - 錯誤

Access violation reading location 0xfeeeff02.

什麼是這個錯誤的原因是什麼?

+2

請將您的代碼降低到引發問題所需的最低*值。 – 2011-05-24 23:39:31

+0

@Oli Charlesworth我做到了這一點 – Abanoub 2011-05-25 01:57:05

+1

不是真的 - 我不能把你發佈的代碼編譯並測試/調試它,因爲它沒有完成。發佈重現您所看到的行爲所需的*完整,最小*代碼。 – ildjarn 2011-05-25 02:19:39

回答

3

你的io_service超出了範圍start_accept(),這是不好的,可能不是你想要的。

改變這種

Server::Server(...) { 
     m_factory = factory; 
     start_accept(); 

     std::cout<<"Socket accepting connections..."<<std::endl; 
} 

void Server::start_accept() { 
    boost::asio::io_service io_service; 
         ^^^^^^^^^ 
    std::shared_ptr<Connection> conn = m_factory->create(io_service); 

    acceptor_.async_accept(conn->socket(), 
     boost::bind(&Server::handle_accept, this,conn, 
      boost::asio::placeholders::error)); 

} 

這個

Server::Server(...) { 
     m_factory = factory; 
     start_accept(io_service); 
         ^^^^^^^^^ 

     std::cout<<"Socket accepting connections..."<<std::endl; 
} 

void Server::start_accept(const boost::asio::io_service& io_service){ 
    std::shared_ptr<Connection> conn = m_factory->create(io_service); 

    acceptor_.async_accept(conn->socket(), 
     boost::bind(&Server::handle_accept, this,conn, 
      boost::asio::placeholders::error)); 

} 

雖然,因爲您的意見建議,你真的應該張貼問題的一個自包含的例子。以上建議是我最好的猜測。