【问题标题】:In boost::asio, why does the asynchronous accept handler need to restart the asynchronous accept?boost::asio中,为什么异步accept handler需要重启异步accept?
【发布时间】:2014-01-10 03:48:03
【问题描述】:

在 boost::asio(异步 TCP 服务器)的 Daytime.3 教程中,tcp_server 类包含以下两个方法:

void start_accept()
{
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      boost::bind(&tcp_server::handle_accept, this, new_connection,
        boost::asio::placeholders::error));
}

void handle_accept(tcp_connection::pointer new_connection,
    const boost::system::error_code& error)
{
  if (!error) new_connection->start(); // ***

  start_accept();
}

我关心的是标记为*** 的行。如果此操作需要很长时间才能完成怎么办?即使没有,在*** 行和对start_accept 的调用之间也必须有一些时间间隔,在此期间服务器将无法接受传入的连接。 async_accept 注册一个在接受第一个连接时不会停止的操作系统处理程序不是更有意义吗?另外,这是一个真正的问题吗?我该如何解决?

【问题讨论】:

    标签: c++ boost asynchronous tcp boost-asio


    【解决方案1】:

    服务器不会“无法接受传入连接”;这就是 listen() 函数的第二个参数在套接字 API 中的用途。但是您是正确的,服务器在处理客户端请求时可能会有延迟。需要大量计算的单线程应用程序会导致问题,因此这个特定示例实际上只执行 IO。如果您的服务器确实需要执行 CPU 密集型任务,则应将处理程序传递给某种任务管理器。

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      相关资源
      最近更新 更多