Frage

Ich bin für den besten Weg, um das Boost-Asio HTTP Server 3 Beispiel eine Liste der aktuell verbundenen Clients zu erhalten.

Wenn ich ändere server.hpp aus dem Beispiel, wie:

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_;
};

ich dann die Lebensdauer des Verbindungsobjekts vermasselt, so dass sie nicht vom Client aus Umfang und trennte nicht gehen, weil es immer noch eine Referenz in dem ConnectionList gehalten hat.

Wenn stattdessen meine ConnectionList als typedef std::vector< boost::weak_ptr< connection > > ConnectionList; definiert wird dann betreibe ich das Risiko des Kunden zu trennen und zunichte macht seinen Zeiger während jemand aus GetClientList() verwendet wird.

Jeder habe einen Vorschlag auf eine gute und sichere Art und Weise, dies zu tun?

Danke, PaulH

War es hilfreich?

Lösung

HTTP staatenlos. Das bedeutet, dass es schwierig ist, zu definieren, was auch „aktuell verbundenen Client“ bedeutet, nicht zu erwähnen Spur zu halten, von denen Kunden sind zu einem bestimmten Zeitpunkt. Das einzig Mal, wenn es wirklich ein „aktuelles Client“ ist aus der Zeit, eine Anfrage an die Zeit erhalten wird, die Anforderung bedient wird (oft nur wenige Millisekunden). Eine Verbindung wird nicht einmal für die Dauer des Herunterladens eine Seite gehalten -. Vielmehr jedes Element auf der Seite angefordert und separat gesendet

Die typische Methode, um diese für die Handhabung ist eine ziemlich einfache Timeout verwenden - ein Client wird als „verbunden“ für einige willkürliche Länge der Zeit (wenige Minuten), nachdem sie in einer Anfrage senden. Ein Cookie von einer Art verwendet, um den Client sendet in einer bestimmten Anforderung zu identifizieren.

Der Rest von dem, was du redest ist nur eine Frage der sicherstellen, dass die Sammlung, die Sie verwenden Verbindungsinformationen zu halten Thread-sicher ist. Sie haben einen Thread, die Verbindungen, einen Thread fügt hinzu, dass sie und N Threads löscht, die die Daten aktuell in der Liste verwenden. Die Standard-Sammlungen garantieren keine Thread-Sicherheit, aber es gibt andere, um das tun.

Andere Tipps

Sorry, ich habe nicht genug Ruf zu kommentieren, also werde ich es hier schreiben.

Kommentar zu antworten: „HTTP staatenlos“ - aber die Verbindung ist zustandsbehaftete! Bitte sorgfältig lesen HTTP / 1.1-Dokumentation, das Standardverhalten ist „Connection: keep-alive“, also wenn Sie HTTP-Server implementieren Sie für eine weitere Anforderung auf derselben Verbindung warten muss. Dies ist besonders wichtig für HTTPS, spart viel Zeit durch die Anzahl der Handschläge zu reduzieren. Deshalb ist jeder konformer Server muss verstehen, wie Verbindungen zu halten.

In Bezug auf die Frage, gibt es eine gewisse Logik in Sie „Verbindung“ Klasse - (. Fehler, alles getan, usw.) in jedem Handler von Asynchron-Betrieb, entweder Sie einen anderen async Betrieb starten oder die gesamte Kette stoppen

Schreiben Sie eine Funktion in Ihrer „Verbindung“ Klasse, wie tell_server_im_done, in dieser Funktion erklären Sie Ihre „Server“ Instanz selbst aus der Liste zu entfernen. Sie sollten Sie „Verbindung“ Konstruktor einen Zeiger oder Verweis auf Ihrem Server-Objekt für diese geben zu arbeiten.

Tipps von Multithreading: Start von allem im einzelnen Thread zu tun. Sie benötigen gutes Verständnis des Durchzugs das Ganze richtig mit mehreren Threads zu tun, also, wenn der Server nicht überlastet ist, halten Sie es so lange wie möglich Single-Thread. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top