multi user chat by boost beast

Table of Contents

overview

@startuml
main -> io_context: construct
main -> shared_state: construct
main -> listener: construct
main -> listener : run
@enduml

classes


@startuml
class http_session 
{
    beast::tcp_stream stream_;
    beast::flat_buffer buffer_;
    boost::shared_ptr state_;

    boost::optional> parser_;

    struct send_lambda;

    void fail(beast::error_code ec, char const* what);
    void do_read();
    void on_read(beast::error_code ec, std::size_t);
    void on_write(beast::error_code ec, std::size_t, bool close);

    void run();
}
class websocket_session 
{
    beast::flat_buffer buffer_;
    websocket::stream ws_;
    boost::shared_ptr state_;
    std::vector> queue_;

    void fail(beast::error_code ec, char const* what);
    void on_accept(beast::error_code ec);
    void on_read(beast::error_code ec, std::size_t bytes_transferred);
    void on_write(beast::error_code ec, std::size_t bytes_transferred);

    void run(http::request> req);

    void send(boost::shared_ptr const& ss);

    void on_send(boost::shared_ptr const& ss);  
}
class shared_state 
{
    std::string const doc_root_;
    std::mutex mutex_;
    std::unordered_set sessions_;

    void join  (websocket_session* session);
    void leave (websocket_session* session);
    void send  (std::string message);

}
class listener
{
    net::io_context& ioc_;
    tcp::acceptor acceptor_;
    boost::shared_ptr state_;

    void fail(beast::error_code ec, char const* what);
    void on_accept(beast::error_code ec, tcp::socket socket);

    void run();
}

shared_state o-- websocket_session
listener <-- shared_state
http_session <-- shared_state
websocket_session <-- shared_state
@enduml
``

Comments |0|

Legend *) Required fields are marked
**) You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Category: Uncategorized