3

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

如果我将示例中的 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< boost::weak_ptr< connection > > ConnectionList;那么当有人从GetClientList().

有人对这样做的好和安全的方法有什么建议吗?

谢谢,保罗

4

1 回答 1

4

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

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

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

于 2009-11-03T00:29:38.470 回答