在示例中:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/chat/chat_server.cpp我们总是创建新指针以接受新会话。如果我们不这样做,服务器将关闭(如果出错)。我的服务器有一组限制ID,每个会话都有一个。因此,当set为空时,服务器无法响应新会话,直到其中一个ID可以释放。如何在不创建其他对象和任何循环的情况下阻止服务器关闭? (服务器可以获得~1k连接,直到其中一个ID可以释放,并且在使用示例模板时会导致创建1k个附加对象。)
void handle_accept(chat_session_ptr session,
const boost::system::error_code& error)
{
if (!error || !setIds.empty())
{
session->start();
chat_session_ptr new_session(new chat_session(io_service_, room_));
acceptor_.async_accept(new_session->socket(),
boost::bind(&chat_server::handle_accept, this, new_session,
boost::asio::placeholders::error));
}
}
答案 0 :(得分:1)
看起来你可能应该在接受新连接之前创建一些等待条件,如果你是在ID"之后。
因为,如果你不这样做,你可以通过制作
继续接受 acceptor_.async_accept(new_session->socket(),
boost::bind(&chat_server::handle_accept, this, new_session,
boost::asio::placeholders::error));
无条件,但有一个循环:您将浪费资源接受在ID可用之前无法处理的连接。
更糟糕的是(可能),您将丢弃您可能能够处理的连接,例如1ms,10ms或100ms。
我建议让操作系统在积压工作中保持这种联系 - 不要及早接受它们。
或者,您可以接受所有连接,但如果您没有ID,则将它们放入队列中(仅当队列为空时才开始丢弃连接)。我考虑使用信号量来管理可用ID池。