【问题标题】:Boost HTTP server issueBoost HTTP 服务器问题
【发布时间】:2013-09-13 17:57:16
【问题描述】:

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

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

与示例的唯一区别是我通过自己的方法“run”运行服务器并在后台线程中启动 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());
    }
}

【问题讨论】:

  • io_service_.run() 在哪里?
  • 可能是我误解了文档 (boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/…),但 AFAIU 因为我正在创建“工作”对象,所以我不需要这个。
  • Work 对象仅确保 io_service::run 不会退出(引用您的链接:"这确保 io_service 对象的 run() 函数在工作进行时不会退出,并且当没有未完成的工作时,它会退出。”)。但是如果你不打电话给io_service::run,没有人会为你这样做。
  • 好的,谢谢,我明白了。

标签: c++ http boost boost-asio


【解决方案1】:

您应该调用io_service_::run() - 否则没有人会调度由io_service_ 服务的Asio 对象的完成处理程序。

【讨论】:

  • 我明白了,但我有一个问题:work 对象会阻止io_service::run 阻塞吗?或者我需要做什么才能获得这种行为?
  • @Val 否,work 延长 run 阻塞,因为 run 阻塞,只要它有任何工作。如果您需要非阻塞处理程序泵送,请使用poll(并且您不需要work 对象;boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/…)。我真的建议您阅读 Asio 教程并阅读其参考,编写应用程序之前。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回复。我正在使用 linux(如果重要的话,Mint 14 x64),并且我已经更新了我的问题,添加了运行方法的代码。希望现在更清楚了。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2013-12-22
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多