1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- //
- // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- //
- // Official repository: https://github.com/vinniefalco/CppCon2018
- //
- #ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_WEBSOCKET_SESSION_HPP
- #define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_WEBSOCKET_SESSION_HPP
- #include "net.hpp"
- #include "beast.hpp"
- #include "shared_state.hpp"
- #include <cstdlib>
- #include <memory>
- #include <string>
- #include <vector>
- // Forward declaration
- class shared_state;
- /** Represents an active WebSocket connection to the server
- */
- class websocket_session : public boost::enable_shared_from_this<websocket_session>
- {
- beast::flat_buffer buffer_;
- websocket::stream<beast::tcp_stream> ws_;
- boost::shared_ptr<shared_state> state_;
- std::vector<boost::shared_ptr<std::string const>> 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);
- public:
- websocket_session(
- tcp::socket&& socket,
- boost::shared_ptr<shared_state> const& state);
- ~websocket_session();
- template<class Body, class Allocator>
- void
- run(http::request<Body, http::basic_fields<Allocator>> req);
- // Send a message
- void
- send(boost::shared_ptr<std::string const> const& ss);
- private:
- void
- on_send(boost::shared_ptr<std::string const> const& ss);
- };
- template<class Body, class Allocator>
- void
- websocket_session::
- run(http::request<Body, http::basic_fields<Allocator>> req)
- {
- // Set suggested timeout settings for the websocket
- ws_.set_option(
- websocket::stream_base::timeout::suggested(
- beast::role_type::server));
- // Set a decorator to change the Server of the handshake
- ws_.set_option(websocket::stream_base::decorator(
- [](websocket::response_type& res)
- {
- res.set(http::field::server,
- std::string(BOOST_BEAST_VERSION_STRING) +
- " websocket-chat-multi");
- }));
- // Accept the websocket handshake
- ws_.async_accept(
- req,
- beast::bind_front_handler(
- &websocket_session::on_accept,
- shared_from_this()));
- }
- #endif
|