我有一个基于Boost.Asio Example HTTP Server 2 的 http 服务器(使用 io_service-per-CPU 设计)
每个请求都会被解析,检查它是否是 POST 请求,路径是否正确,是否存在 Content-Length 标头,如果这些条件之一不正确,我会生成一个错误请求响应。
由于一切正常,我发送了一个 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 个线程,每个线程在一段时间内连续发送(true)-循环 POST 请求到该服务器。
一会儿它运行平稳快速。然后在某个时间点服务器没有响应(无法连接到远程服务器)。
造成这种情况的原因可能是来自服务器的会话没有正确关闭。
这是 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";
}
}
就像我说的那样,在某些时候它会变得没有响应,不久之后它就会再次响应。