c++ - 如何防止 c++ asio tcp 服务器关闭?

标签 c++ boost boost-asio

例如:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/chat/chat_server.cpp我们总是创建新的指针来接受新的 session 。如果我们不这样做,服务器将关闭(以防出错)。我的服务器有一组限制的 ID,每个 session 都有一个。因此,当设置为空时,服务器无法响应新 session ,直到其中一个 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 池。

关于c++ - 如何防止 c++ asio tcp 服务器关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28491690/

相关文章:

c++ - 如何将谓词传递给算法

c++ - ld 报告缺少符号,但符号似乎存在

c++ - 多线程处理,同时保持部分顺序

linux - Linux 上的套接字接收超时

C++ #define in main,如何让其他.cpp文件看到它?

c++ - 在模板中使用 operator<

c++ - boost 图形库 : deterministic order of iteration of in_edges?

linux - ./configure for libtorrent 在 Linux 上的问题

c++ - boost::任意数字

c++ - 如何确保远程对等方在调用 asio 套接字 close() 函数之前接收到所有数据