如何防止c++asio tcp服务器关闭
How to prevent c++ asio tcp server from shutdown?
例如:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/chat/chat_server.cpp我们总是创建新的指针来接受新的会话。若不这样做,服务器将关闭(以防出现错误)。我的服务器有一组限制ID,每个会话都有一个。所以,当设置为空时,服务器无法响应新会话,直到其中一个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));
}
}
如果您"ID不足",那么在接受新连接之前,您可能应该创建一些等待条件。
因为,如果你不这样做,你可以通过制作来继续接受
acceptor_.async_accept(new_session->socket(),
boost::bind(&chat_server::handle_accept, this, new_session,
boost::asio::placeholders::error));
无条件,但您有一个循环:您将浪费资源接受在ID可用之前无法处理的连接。
更糟糕的是(可能),你会断开原本可以处理的连接,比如1毫秒、10毫秒或100毫秒后。
我建议让操作系统在积压工作中保留这样的连接——不要提前接受它们。
或者,您可以接受所有连接,但如果ID不足,则将它们放入队列中(只有在队列为空时才开始丢弃连接)。我会考虑使用信号量来管理可用ID的池。
相关文章:
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 从 tcp 服务器打开 8MP H264 流时出现问题
- TCP C++客户端从C#服务器接收字节数组
- TCP套接字(客户端-服务器)recv()返回-1值
- 通过TCP将数据从C++客户端发送到JSON服务器
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- Qt TCP服务器不从客户端读取数据
- C++ TCP 服务器比较字符串失败
- 提升 ASIO TCP 服务器架构
- 如何让客户端通过modbus-tcp协议与多个服务器通信?
- C# 客户端到C++服务器 Tcp 套接字连接错误
- 连接后连接丢失 ->服务器 TCP 提升。亚西奥
- 使用qt的多客户端/服务器TCP应用程序
- C++客户端到Java服务器(TCP/IP)
- 简单的客户机/服务器TCP c++
- 多客户端一服务器TCP c++