forked from boostorg/beast
		
	This is the multi-threaded io_context version of the CppCon2018 WebSocket chat server and client example.
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//
 | 
						|
// Copyright (c) 2018 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
 | 
						|
//
 | 
						|
 | 
						|
#include "shared_state.hpp"
 | 
						|
#include "websocket_session.hpp"
 | 
						|
 | 
						|
shared_state::
 | 
						|
shared_state(std::string doc_root)
 | 
						|
    : doc_root_(std::move(doc_root))
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
shared_state::
 | 
						|
join(websocket_session* session)
 | 
						|
{
 | 
						|
    std::lock_guard<std::mutex> lock(mutex_);
 | 
						|
    sessions_.insert(session);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
shared_state::
 | 
						|
leave(websocket_session* session)
 | 
						|
{
 | 
						|
    std::lock_guard<std::mutex> lock(mutex_);
 | 
						|
    sessions_.erase(session);
 | 
						|
}
 | 
						|
 | 
						|
// Broadcast a message to all websocket client sessions
 | 
						|
void
 | 
						|
shared_state::
 | 
						|
send(std::string message)
 | 
						|
{
 | 
						|
    // Put the message in a shared pointer so we can re-use it for each client
 | 
						|
    auto const ss = boost::make_shared<std::string const>(std::move(message));
 | 
						|
 | 
						|
    // Make a local list of all the weak pointers representing
 | 
						|
    // the sessions, so we can do the actual sending without
 | 
						|
    // holding the mutex:
 | 
						|
    std::vector<boost::weak_ptr<websocket_session>> v;
 | 
						|
    {
 | 
						|
        std::lock_guard<std::mutex> lock(mutex_);
 | 
						|
        v.reserve(sessions_.size());
 | 
						|
        for(auto p : sessions_)
 | 
						|
            v.emplace_back(p->weak_from_this());
 | 
						|
    }
 | 
						|
 | 
						|
    // For each session in our local list, try to acquire a strong
 | 
						|
    // pointer. If successful, then send the message on that session.
 | 
						|
    for(auto const& wp : v)
 | 
						|
        if(auto sp = wp.lock())
 | 
						|
            sp->send(ss);
 | 
						|
}
 |