c++ - 系统的boost::asio无限循环:第一次连接后出现9错误

标签 c++ boost boost-asio

我有一个服务器,使用带有以下代码的 asio,100% 从示例中复制。当没有连接时,代码表现良好。但是,一旦第一个客户端连接,handle accept 就开始输出大量的 system:9 错误,我无法连接任何其他客户端。连接的单个客户端可以很好地执行异步读/写。我对自己做错了什么感到茫然。我在线程池中尝试了使用和不使用 io_service 的代码,结果相同。

Server::Server(io_service& io_service,
      const std::string address,
      const std::string port)
    : io_service_(io_service),
    //zmq_strand_(io_service),
      acceptor_(io_service) {

    ip::tcp::resolver resolver(io_service_);
    ip::tcp::resolver::query query(address, port);
    ip::tcp::endpoint endpoint = *resolver.resolve(query);
    acceptor_.open(endpoint.protocol());
    acceptor_.set_option(ip::tcp::acceptor::reuse_address(true));
    acceptor_.bind(endpoint);
    acceptor_.listen(); 
    start_accept();
  }

void Server::start_accept() {
    auto session = std::shared_ptr<Session>(new Session(io_service_,session_manager_));

    acceptor_.async_accept(session->socket()
        ,std::bind(&Server::handle_accept,this,session,std::placeholders::_1));
}

void Server::handle_accept(std::shared_ptr<Session> session, const system::error_code& error) {
  if (!error) {
    std::cout << "handle_accept" << std::endl;
    session->start();
  } else {
      std::cout << error << std::endl;
  }
  start_accept();
}

小更新: 我没有使用 http3 示例,而是使用了 Denis 提出的示例。它不那么复杂,并使服务器运行正常。我还没有找到一个合理的解释为什么前面的代码不起作用。这样做:

Server::Server(
      io_service &service,
      const uint8_t num_threads,
      const std::string address,
      const uint16_t port)
    : 
      num_threads_(num_threads),
    //zmq_strand_(io_service),
      acceptor_(service,ip::tcp::endpoint(ip::tcp::v4(),port)) {

    //io_service::work work(io_service_);
    start_accept();
  }


void Server::start_accept() {
    auto session = std::shared_ptr<Session>(new Session(acceptor_.get_io_service(),session_manager_));

    acceptor_.async_accept(session->socket()
        ,std::bind(&Server::handle_accept,this,session,std::placeholders::_1));
}

void Server::handle_accept(std::shared_ptr<Session> session, const system::error_code& error) {
  if (!error) {
    std::cout << "handle_accept" << std::endl;
    session->start();
  }
  start_accept();
}

void Server::start() {
    std::set<std::unique_ptr<std::thread>> threads;

    for( unsigned int i = 0; i < num_threads_; ++i ) {
        threads.insert(std::unique_ptr<std::thread>(new std::thread( [&]() {
            acceptor_.get_io_service().run();
            }) 
        ));
    }
    std::cout << threads.size() << " threads started" << std::endl;
    for(auto &t:threads) {
        t->join();
    }
    std::cout << threads.size() << " threads joined" << std::endl;
}

最佳答案

仔细查看本教程并将您的代码与教程进行比较:Boost TCP async server example

关于c++ - 系统的boost::asio无限循环:第一次连接后出现9错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14747310/

相关文章:

c++ - 如何在这个程序的输出中得到整数 35 和 50?

c++ - 在构造函数上指定 constexpr 是否会自动使从它创建的所有对象都是 constexpr?

c++ - 从 Boost Graph 中删除多个顶点

c++ - io_service 如何将完成事件与完成处理程序匹配

c++ - 如何在 boost tcp/udp 服务器中处理 control-c

c++ - 提升 async_receive_from ip 过滤器

c++ - Boost iterator_facade 的常量正确性

c++ - std::bind 与类成员函数的 decltype 类型一起工作失败

c++ - VS2013 中的高分辨率时钟

c++ - boost指针容器库可以用作线程安全容器集合吗?