【问题标题】:boost asio run io_service in a threadboost asio 在线程中运行 io_service
【发布时间】:2016-04-20 14:10:45
【问题描述】:

我尝试使用 boost::asio 和 boost::thread 运行异步网络线程。 但是 async_accept 立即返回错误代码 125 - 操作已取消...

附上我的问题的最小样本:

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

【问题讨论】:

    标签: c++ multithreading boost boost-asio


    【解决方案1】:

    acceptor::async_accept 立即返回,在出现错误或接受连接时调度处理程序的调用 (1)

    listen() 函数正在返回,这导致了接受器(2)的破坏

    acceptor(或socket,或deadline_timer)被销毁时,所有待处理的处理程序都安排在io_service上,错误代码为asio::error::operation_aborted。这是为了满足 async_ 函数的后置条件(即“处理程序将只被调用一次,就像被 io_service.post() 调用一样”)(3)

    因此,在第 (2) 点,您的处理程序正在被调度 - 就在代码返回主循环之前。

    修复:

    确保acceptor 在处理程序被调用之前一直存在。这是 asio 异步编程的标准做法。 boost 网站上的示例将帮助您理解(稀疏的)asio 文档。

    不要失去希望。我花了很长时间来学习如何正确使用 asio,并意识到它的强大功能。

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 1970-01-01
      • 2011-12-18
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多