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().

これを行うための適切で安全な方法について誰か提案がありますか?

ありがとう、ポールH

4

1 に答える 1

4

HTTPはステートレスです。つまり、「現在接続されているクライアント」が何を意味するのかを定義することすら困難であり、いつでもどのクライアントが存在するかを追跡することは言うまでもありません。実際に「現在のクライアント」が存在するのは、要求が受信されてから要求が処理されるまで(多くの場合、数ミリ秒のみ)です。1ページをダウンロードしている間も接続は維持されません。むしろ、ページ上の各アイテムは個別に要求され、送信されます。

これを処理するための一般的な方法は、かなり単純なタイムアウトを使用することです。クライアントは、要求を送信した後、任意の時間(数分)「接続されている」と見なされます。ある種のCookieは、特定の要求を送信するクライアントを識別するために使用されます。

あなたが話している残りのことは、接続情報を保持するために使用するコレクションがスレッドセーフであることを確認することだけです。接続を追加するスレッドが1つ、接続を削除するスレッドが1つ、現在リストにあるデータを使用するスレッドがNつあります。標準のコレクションはスレッドセーフを保証するものではありませんが、他にも保証されています。

于 2009-11-03T00:29:38.470 に答える