11#include <boost/asio/read.hpp>
12#include <boost/asio/write.hpp>
24 , _socket( io_context )
25 , _inputDeadline( io_context.get_executor() )
26 , _nonEmptyOutputQueue( io_context.get_executor() )
27 , _outputDeadline( io_context.get_executor() )
28 , _startTime( time( nullptr ) )
29 , _strand(
std::make_unique<boost::asio::io_context::strand>( io_context ) )
44 check_deadline( &_inputDeadline );
51 check_deadline( &_outputDeadline );
85 _inputDeadline.expires_from_now( boost::posix_time::seconds( 30 ) );
90 [&](
const boost::system::error_code ec,
const std::size_t N )
92 handle_read_body( ec, N );
105 _inputDeadline.expires_from_now( boost::posix_time::seconds( 30 ) );
109 [&](
const boost::system::error_code code,
const std::size_t N )
111 handle_read_packet( code, N );
158 boost::asio::streambuf buf;
166 size_t header = buf.size();
168 buffers.push_back( boost::asio::buffer( &header,
sizeof header ) );
169 buffers.push_back( buf.data() );
176 [&](
const boost::system::error_code code,
const size_t )
178 handle_write_file( code );
186 [&](
const boost::system::error_code code,
const size_t )
188 handle_write( code );
195 boost::asio::streambuf request_;
197 std::ifstream source_file;
198 source_file.open( filePath.c_str(),
199 std::ios_base::binary | std::ios_base::ate );
205 const size_t file_size = source_file.tellg();
206 source_file.seekg( 0 );
208 std::ostream request_stream( &request_ );
209 request_stream << filePath <<
"\n" << file_size <<
"\n\n";
217 _strand->wrap( [&](
const boost::system::error_code code,
const size_t )
219 handle_write( code );
266 if ( deadline->expires_at() <= boost::asio::deadline_timer::traits_type::now() )
275 deadline->async_wait( [&](
const boost::system::error_code )
287 const boost::asio::ip::udp::endpoint& broadcast_endpoint )
288 : socket_( io_context )
290 socket_.connect( broadcast_endpoint );
295 boost::asio::streambuf buf;
301 size_t header = buf.size();
303 buffers.push_back( boost::asio::buffer( &header,
sizeof header ) );
304 buffers.push_back( buf.data() );
305 boost::system::error_code ignored_ec;
306 socket_.send( buffers, 0, ignored_ec );
311 switch ( p.opcode() )
static void LOG_PRINT(const char *msg, bool error=false)
static const ValueType SMSG_SEND_FILE
static const ValueType CMSG_PING
static const ValueType CMSG_ENTITY_UPDATE
static const ValueType CMSG_REQUEST_DISCONNECT
static const ValueType SMSG_PONG
static const ValueType SMSG_DISCONNECT
static const ValueType MSG_HEARTBEAT
bool saveToBuffer(boost::asio::streambuf &buf) const
bool loadFromBuffer(boost::asio::streambuf &buf)
void leave(const subscriber_ptr &sub)
void join(const subscriber_ptr &sub)
eastl::deque< WorldPacket > _outputQueue
deadline_timer _inputDeadline
eastl::deque< string > _outputFileQueue
virtual void HandlePingOpCode(WorldPacket &p)
virtual void HandleEntityUpdateOpCode(WorldPacket &p)
boost::asio::streambuf _inputBuffer
virtual void sendFile(const string &fileName)
virtual void handlePacket(WorldPacket &p)
virtual void await_output()
virtual void HandleDisconnectOpCode(WorldPacket &p)
virtual void handle_write_file(const boost::system::error_code &ec)
virtual void handle_read_body(const boost::system::error_code &ec, size_t bytes_transferred)
std::unique_ptr< boost::asio::io_context::strand > _strand
deadline_timer _outputDeadline
tcp_session_tpl(boost::asio::io_context &io_context, channel &ch)
deadline_timer _nonEmptyOutputQueue
virtual void handle_read_packet(const boost::system::error_code &ec, size_t bytes_transferred)
virtual void HandleHeartBeatOpCode(WorldPacket &p)
void sendPacket(const WorldPacket &p) override
virtual bool stopped() const
virtual void handle_write(const boost::system::error_code &ec)
virtual void start_read()
virtual void start_write()
virtual void check_deadline(deadline_timer *deadline)
void sendPacket(const WorldPacket &p) override
udp_broadcaster(boost::asio::io_context &io_context, const boost::asio::ip::udp::endpoint &broadcast_endpoint)
Str StringFormat(const char *fmt, Args &&...args)
Handle console commands that start with a forward slash.
void UpdateEntities(WorldPacket &p)
eastl::vector< Type > vector
boost::asio::basic_deadline_timer< boost::posix_time::ptime, boost::asio::time_traits< boost::posix_time::ptime >, boost::asio::io_context::executor_type > deadline_timer