2018-03-06 22:22:19 +01:00
|
|
|
#include "Hive.h"
|
2017-08-08 13:53:47 +02:00
|
|
|
#include "Acceptor.h"
|
2018-03-06 22:22:19 +01:00
|
|
|
#include "Connection.h"
|
2017-08-08 13:53:47 +02:00
|
|
|
#include <boost/bind.hpp>
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
namespace Core {
|
|
|
|
namespace Network {
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-10-24 15:17:40 +02:00
|
|
|
Acceptor::Acceptor( HivePtr hive ) :
|
2018-08-29 21:40:59 +02:00
|
|
|
m_hive( hive ),
|
|
|
|
m_acceptor( hive->GetService() ),
|
|
|
|
m_io_strand( hive->GetService() ),
|
|
|
|
m_error_state( 0 )
|
|
|
|
{
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
Acceptor::~Acceptor()
|
|
|
|
{
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
bool Acceptor::OnAccept( ConnectionPtr connection, const std::string& host, uint16_t port )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-10-24 15:17:40 +02:00
|
|
|
void Acceptor::OnError( const asio::error_code& error )
|
2018-08-29 21:40:59 +02:00
|
|
|
{
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
|
2018-10-24 15:17:40 +02:00
|
|
|
void Acceptor::StartError( const asio::error_code& error )
|
2018-08-29 21:40:59 +02:00
|
|
|
{
|
2018-10-24 13:52:27 +02:00
|
|
|
uint32_t v1 = 1;
|
|
|
|
uint32_t v2 = 0;
|
|
|
|
if( m_error_state.compare_exchange_strong( v1, v2 ) )
|
2018-08-29 21:40:59 +02:00
|
|
|
{
|
|
|
|
boost::system::error_code ec;
|
|
|
|
m_acceptor.cancel( ec );
|
|
|
|
m_acceptor.close( ec );
|
|
|
|
OnError( error );
|
|
|
|
}
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void Acceptor::DispatchAccept( ConnectionPtr connection )
|
|
|
|
{
|
|
|
|
m_acceptor.async_accept( connection->GetSocket(),
|
|
|
|
connection->GetStrand().wrap( boost::bind( &Acceptor::HandleAccept,
|
|
|
|
shared_from_this(),
|
|
|
|
_1,
|
|
|
|
connection ) ) );
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-10-24 15:17:40 +02:00
|
|
|
void Acceptor::HandleAccept( const asio::error_code& error, ConnectionPtr connection )
|
2018-08-29 21:40:59 +02:00
|
|
|
{
|
|
|
|
if( error || HasError() || m_hive->HasStopped() )
|
|
|
|
{
|
|
|
|
connection->StartError( error );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( connection->GetSocket().is_open() )
|
|
|
|
{
|
|
|
|
if( OnAccept( connection,
|
|
|
|
connection->GetSocket().remote_endpoint().address().to_string(),
|
|
|
|
connection->GetSocket().remote_endpoint().port() ) )
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
connection->OnAccept( m_acceptor.local_endpoint().address().to_string(),
|
|
|
|
m_acceptor.local_endpoint().port() );
|
|
|
|
connection->Recv();
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
connection->StartError( error );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void Acceptor::Stop()
|
|
|
|
{
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void Acceptor::Accept( ConnectionPtr connection )
|
|
|
|
{
|
|
|
|
m_io_strand.post( boost::bind( &Acceptor::DispatchAccept, shared_from_this(), connection ) );
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void Acceptor::Listen( const std::string& host, const uint16_t& port )
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2018-10-24 15:17:40 +02:00
|
|
|
asio::ip::tcp::resolver resolver( m_hive->GetService() );
|
|
|
|
asio::ip::tcp::resolver::query query( host, std::to_string( port ) );
|
|
|
|
asio::ip::tcp::endpoint endpoint = *resolver.resolve( query );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
|
|
|
m_acceptor.open( endpoint.protocol() );
|
2018-10-24 15:17:40 +02:00
|
|
|
m_acceptor.set_option( asio::ip::tcp::acceptor::reuse_address( false ) );
|
2018-08-29 21:40:59 +02:00
|
|
|
m_acceptor.bind( endpoint );
|
2018-10-24 15:17:40 +02:00
|
|
|
m_acceptor.listen( asio::socket_base::max_connections );
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
|
|
|
catch( ... )
|
|
|
|
{
|
|
|
|
// this should not happen
|
|
|
|
assert( true );
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
HivePtr Acceptor::GetHive()
|
|
|
|
{
|
|
|
|
return m_hive;
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-10-24 15:17:40 +02:00
|
|
|
asio::ip::tcp::acceptor& Acceptor::GetAcceptor()
|
2018-08-29 21:40:59 +02:00
|
|
|
{
|
|
|
|
return m_acceptor;
|
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
bool Acceptor::HasError()
|
|
|
|
{
|
2018-10-24 13:52:27 +02:00
|
|
|
uint32_t v1 = 1;
|
|
|
|
uint32_t v2 = 1;
|
|
|
|
return ( m_error_state.compare_exchange_strong( v1, v2 ) );
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
2017-12-18 14:45:15 +01:00
|
|
|
}
|