1

我开始使用 Boost,所以可能是我搞砸了。

我正在尝试使用 boost (ASIO) 设置 http 服务器。我从文档中获取了代码:http: //www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/examples/cpp03_examples.html(HTTP Server,第一个)

与示例的唯一区别是我通过自己的方法“运行”运行服务器并在后台线程中启动 io_service,如在文档中:http: //www.boost.org/doc/libs/1_54_0/doc/html /boost_asio/reference/io_service.html

boost::asio::io_service::work work(io_service_);

(此外,我也正在从我的运行方法中停止 io_service 。)

当我启动这个修改后的服务器时,一切似乎都很好,运行方法工作正常。但是后来我试图从服务器获取一个文档,请求挂起并且控制流永远不会到达“request_handle”方法。我错过了什么吗?

UPD。这是我的运行方法代码:

void NetstreamServer::run()
{
  LOG4CPLUS_DEBUG(logger, "NetstreamServer is running");
  boost::asio::io_service::work work(io_service_);
    try
    {
      while (true)
      {
        if (condition)
        {
          io_service_.stop();
          break;
        }
      }
    }
    catch (std::exception const& e)
    {
      LOG4CPLUS_ERROR(logger, "NetstreamServer" << " caught exception: " << e.what());
    }
}
4

2 回答 2

1

您应该调用- 否则没有人io_service_::run()会分派Asio.io_service_

于 2013-09-14T18:20:35.283 回答
0

不包括你改的代码,这里大家只能猜了。不幸的是,您也不包括您正在使用的编译器和操作系统。即使 boost 声称它是独立于平台的,您也应该始终包含此信息,因为事实上,即使使用 boost,平台也是不同的。

让我猜一猜。您使用微软视窗吗?你如何防止“主要”功能退出?您在另一个线程中将阻塞“运行”函数移出,主函数不再有等待点。让我再猜一次,你使用了“getchar”之类的东西。这样,您只需按键盘返回键即可退出服务器。如果是,问题出在 getchar 上,不幸的是阻塞了 asio 套接字实现的每个 io,但仅在基于 Windows 的系统上。

我不需要猜测您是否会包含帖子中提到的信息。特别是您对代码示例所做的所有(!)更改。

于 2013-09-13T18:31:58.783 回答