2016-04-20 4 views
3

Я пытаюсь запустить сетевой поток async, используя boost :: asio и boost :: thread. Но async_accept немедленно возвращает ошибку с кодом 125 - операция отменяется ...boost asio run io_service в потоке

прилагается I минимального образца задачи:

#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/thread.hpp> 

class Server{ 

public: 
    Server() 
    { } 

    void listen(unsigned int port) 
    { 
     boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port); 
     boost::asio::ip::tcp::acceptor acceptor(m_io_service, endpoint); 

     std::cout << "Waiting for incomming connection on port: " << port << std::endl; 

     acceptor.async_accept(*m_stream.rdbuf(), boost::bind(&Server::handleAccept, this, boost::asio::placeholders::error, boost::ref(acceptor))); 
     m_listenThread = new boost::thread(boost::bind(&boost::asio::io_service::run, &m_io_service)); 

    } 

    void stop() 
    { 
     m_listenThread->join(); 
    } 

private: 

    void handleAccept(const boost::system::error_code& error, boost::asio::ip::tcp::acceptor& acceptor) 
    { 
     std::cout << "receiverd incomming connection" << std::endl; 
     if(error) 
      std::cout << "ERROR: " << error.message() << "(" << error.value() << ")" << std::endl; 

    } 

    boost::asio::io_service m_io_service; 
    boost::asio::ip::tcp::iostream m_stream; 
    boost::thread* m_listenThread; 


}; 



int main(int argc, char *argv[]) 
{ 
    Server server; 
    server.listen(10000); 

    while(1); 
} 

ответ

3

acceptor::async_accept возвращается немедленно, планирование вызова обработчика когда либо есть ошибка или соединение принимается (1)

прослушивания() функция возвращает, которая вызывает разрушение акцептора (2)

Когда acceptor (или socket, или deadline_timer), все ожидающие обработчики запланированы на io_service с кодом ошибки asio::error::operation_aborted. Это должно удовлетворять постусловиям асинхронных функций (т. Е. «Обработчик будет называться ровно один раз, как если бы io_service.post()») (3)

Следовательно, в точке (2) ваш обработчик запланировано - перед тем, как код вернется в основной цикл.

Чтобы исправить:

убедитесь, что acceptor выживает, пока обработчик не был вызван. Это стандартная практика в асинхронном программировании asio. Примеры на веб-сайте boost помогут вам понять (разреженную) документацию asio.

Не теряйте надежду. Мне потребовалось много времени, чтобы научиться правильно использовать asio и понять, насколько это фантастически мощно.

Смежные вопросы