eidheim / Simple-WebSocket-Server

A very simple, fast, multithreaded, platform independent WebSocket (WS) and WebSocket Secure (WSS) server and client library implemented using C++11, Boost.Asio and OpenSSL. Created to be an easy way to make WebSocket endpoints in C++.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[suggest] Send/Broadcast and Text/BinaryMode

nicezic opened this issue · comments

Hello, @eidheim

First, thanks to make this Simple WebSocket.

I needed to send binary mode.
I found the article, #30, about this, and applied to my project.

FYI, here is my wrappers.
Furthermore, I wish to consider these warpping functions,
and merged into SimpleWeb::SocketServer.

Sincerely, YeonHo Park from South Korea.
Thanks.

using WsServer = SimpleWeb::SocketServer<SimpleWeb::WS>;
WsServer m_ws_server;
   void SendText( shared_ptr<WsServer::Connection> connection,
                  const std::string& message,
                  const std::function<void( const error_code& )>& callback = nullptr );
   void SendBinary( shared_ptr<WsServer::Connection> connection,
                    const std::shared_ptr<WsServer::SendStream>& send_stream,
                    const std::function<void( const error_code& )>& callback = nullptr );
   void BroadcastBinary( const std::shared_ptr<WsServer::SendStream>& send_stream,
                         const std::function<void( const error_code& )>& callback = nullptr );
   void BroadcastText( const std::string& message_to_send,
                       const std::function<void( const error_code& )>& callback = nullptr );

void Websocket::SendText( shared_ptr<WsServer::Connection> connection,
                          const std::string& message,
                          const std::function<void( const error_code& )>& callback )
{
   auto send_stream = make_shared<WsServer::SendStream>();
   *send_stream << message;
   connection->send( send_stream, callback, 129 ); // fin_rsv_opcode: 129 = one fragment & text.
}

void Websocket::SendBinary( shared_ptr<WsServer::Connection> connection,
                            const std::shared_ptr<WsServer::SendStream>& send_stream,
                            const std::function<void( const error_code& )>& callback )
{
   connection->send( send_stream, callback, 130 ); // fin_rsv_opcode: 130 = one fragment & binary.
}

void Websocket::BroadcastBinary( const std::shared_ptr<WsServer::SendStream>& send_stream,
                                 const std::function<void( const error_code& )>& callback )
{
   for( auto& a_connection : m_ws_server.get_connections() )
      SendBinary( a_connection, send_stream, callback );
}

void Websocket::BroadcastText( const string& message_to_send, 
                               const std::function<void( const error_code& )>& callback )
{
   for( auto& a_connection : m_ws_server.get_connections() )
      SendText( a_connection, message_to_send, callback );
}

// example.
auto send_stream = make_shared<WsServer::SendStream>();
*send_stream << YOUR_BINARY_DATA;
Websocket::getInstance()->BroadcastBinary( send_stream );

Thank you for these suggestions, I'll think about this in the following weeks. There are also some additional related changes I have planned before the major version bump.