【问题标题】:boost asio: maintaining a list of connected clientsboost asio:维护已连接客户端的列表
【发布时间】:2014-01-13 03:58:53
【问题描述】:

我正在寻找修改 Boost Asio HTTP Server 3 example 以维护当前连接的客户端列表的最佳方法。

如果我将示例中的 server.hpp 修改为:

class server : private boost::noncopyable
{
public:
    typedef std::vector< connection_ptr > ConnectionList;

    // ...

    ConnectionList::const_iterator GetClientList() const
    {
        return connection_list_.begin();
    };

    void handle_accept(const boost::system::error_code& e)
    {
        if (!e)
        {
            connection_list_.push_back( new_connection_ );
            new_connection_->start();
            // ...
        }
    }

private:
    ConnectionList connection_list_;
};

然后我弄乱了连接对象的生命周期,这样它就不会超出范围并与客户端断开连接,因为它仍然在 ConnectionList 中维护了一个引用。

如果我的 ConnectionList 被定义为 typedef std::vector&lt; boost::weak_ptr&lt; connection &gt; &gt; ConnectionList;,那么当有人从 GetClientList() 使用它时,我冒着客户端断开连接并使其指针无效的风险。

任何人有一个好的和安全的方式来做这件事的建议?

谢谢, 保罗H

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    HTTP 是无状态的。这意味着甚至很难定义“当前连接的客户端”是什么意思,更不用说在任何给定时间跟踪哪些客户端了。 真正“当前客户端”的唯一时间是从收到请求到处理请求的时间(通常只有几毫秒)。即使在下载一个页面期间也不会保持连接 - 相反,页面上的每个项目都是单独请求和发送的。

    处理此问题的典型方法是使用相当简单的超时——客户端在发送请求后的任意时间长度(几分钟)内被视为“已连接”。某种 cookie 用于识别发送特定请求的客户端。

    您所谈论的其余内容只是确保用于保存连接信息的集合是线程安全的。您有一个添加连接的线程,一个删除连接的线程,以及使用列表中当前数据的 N 个线程。标准集合不保证任何线程安全,但还有其他的可以保证。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多