Boost.Asio HTTP服务器会话关闭

时间:2013-03-22 11:18:12

标签: c++ boost-asio

我有一个基于Boost.Asio Example HTTP Server 2 (using an io_service-per-CPU design)

的http服务器

每个请求都会被解析,检查是否是POST-Request,如果Path是正确的,如果Content-Length Header存在,如果其中一个条件不正确,我会生成Bad-Request Response。

一切正常,我发送一个OK响应。

这就是它如何开始。

int main(int argc, char* argv[])
{
  try
  {
    http::server s("127.0.0.1", "88", 1024);
    s.run();
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }
  return 0;
}

现在我做了一个快速的C#应用​​程序,它启动了16个线程,每个线程连续发送(真实)-Loop POST-Requests到这个服务器。

一段时间它运行平稳而快速。然后在某个时间点服务器无响应(无法连接到远程服务器)。

原因可能是来自服务器的会话无法正常关闭。

以下是Bad-Request / OK响应的代码:

void session::handle_request()
{
  //Generate OK Response
  reply_ = reply::stock_reply(reply::ok);
  //Send OK Response
  boost::asio::async_write(client_socket_, reply_.to_buffers(), 
    boost::bind(&session::handle_client_write, shared_from_this(),
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));
}

void session::send_bad_request()
{
  //Generate Bad Request Response
  reply_ = reply::stock_reply(reply::bad_request);
  //Send Bad Request Response
  boost::asio::async_write(client_socket_, reply_.to_buffers(), 
    boost::bind(&session::handle_client_write, shared_from_this(),
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));
}

还有handle_client_write,它们都触发:

void session::handle_client_write(const boost::system::error_code& err, size_t len)
{
  if (!err) {
    //Dummy Error Code Var
    boost::system::error_code ignored_ec;
    //Shutdown socket
    client_socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);
    client_socket_.close();
    //std::cout << "Closed" << ignored_ec.message() << "\n";
  }
  else {
    std::cout << "Error: " << err.message() << "\n";
  }
}

就像我说的那样,它在某些时候没有反应,经过很短的时间再次回复。

0 个答案:

没有答案