32 m_address(peer_info.m_address) ,
33 m_socket(
std::move(peer_info.m_socket)) ,
34 m_sp(*this,es,*this,*m_socket,peer_info.m_server_peer_config.socket_protocol_config) ,
35 m_line_buffer(line_buffer_config) ,
36 m_config(peer_info.m_server_peer_config) ,
37 m_idle_timer(*this,&
ServerPeer::onIdleTimeout,es)
39 G_ASSERT( peer_info.m_server !=
nullptr ) ;
40 G_ASSERT( m_socket.get() ) ;
42 G_DEBUG(
"GNet::ServerPeer::ctor: [" <<
this <<
"]: port " << m_address.
port() ) ;
44 if( m_config.idle_timeout )
45 m_idle_timer.startTimer( m_config.idle_timeout ) ;
47 m_socket->addReadHandler( *
this , es ) ;
48 m_socket->addOtherHandler( *
this , es ) ;
54 G_DEBUG(
"GNet::ServerPeer::dtor: [" <<
this <<
"]: port " << m_address.port() ) ;
65 return m_sp.secureAcceptCapable() ;
71 m_line_buffer.expect( n ) ;
77 G_ASSERT( m_socket !=
nullptr ) ;
83 socket().dropReadHandler() ;
88 socket().addReadHandler( *
this , m_es ) ;
91void GNet::ServerPeer::otherEvent( EventHandler::Reason reason )
93 m_sp.otherEvent( reason , m_config.no_throw_on_peer_disconnect ) ;
96void GNet::ServerPeer::readEvent()
98 if( m_sp.readEvent( m_config.no_throw_on_peer_disconnect ) )
104 G_ASSERT( m_socket !=
nullptr ) ;
105 return m_socket->getLocalAddress() ;
115 return m_address.displayString() ;
120 return m_sp.peerCertificate() ;
125 if( m_config.kick_idle_timer_on_send && m_config.idle_timeout )
126 m_idle_timer.startTimer( m_config.idle_timeout ) ;
127 return m_sp.send( data , 0U ) ;
132 if( m_config.kick_idle_timer_on_send && m_config.idle_timeout )
133 m_idle_timer.startTimer( m_config.idle_timeout ) ;
134 return m_sp.send( data ) ;
140 if( m_config.kick_idle_timer_on_send && m_config.idle_timeout )
141 m_idle_timer.startTimer( m_config.idle_timeout ) ;
142 return m_sp.send( segments , offset ) ;
146void GNet::ServerPeer::writeEvent()
148 if( m_sp.writeEvent() )
154 G_DEBUG(
"GNet::ServerPeer::doOnDelete: reason=[" << reason <<
"]" ) ;
155 onDelete( done ? std::string() : reason ) ;
158void GNet::ServerPeer::onIdleTimeout()
160 std::ostringstream ss ;
161 ss <<
"no activity after " << m_config.idle_timeout <<
"s" ;
162 throw IdleTimeout( ss.str() ) ;
167 if( m_config.idle_timeout )
168 m_idle_timer.startTimer( m_config.idle_timeout ) ;
170 bool fragments = m_line_buffer.transparent() ;
171 m_line_buffer.apply(
this , &ServerPeer::onDataImp , data , size , fragments ) ;
174bool GNet::ServerPeer::onDataImp(
const char * data , std::size_t size , std::size_t eolsize ,
175 std::size_t linesize ,
char c0 )
177 return onReceive( data , size , eolsize , linesize , c0 ) ;
185std::string GNet::ServerPeer::exceptionSourceId()
const
187 if( m_exception_source_id.empty() )
189 m_exception_source_id = peerAddress().hostPartString() ;
191 m_exception_source_id = peerAddress().displayString() ;
193 return m_exception_source_id ;
198 m_config.idle_timeout = s ;
199 m_idle_timer.cancelTimer() ;
200 if( m_config.idle_timeout )
201 m_idle_timer.startTimer( m_config.idle_timeout ) ;
211void GNet::ServerPeer::onPeerDisconnect()
The GNet::Address class encapsulates a TCP/UDP transport address.
unsigned int port() const
Returns port part of the address.
A tuple containing an ExceptionHandler interface pointer and a bound 'exception source' pointer.
Provides information about the state of a line buffer.
static void addServerPeer(const Connection &server_peer)
Adds a server connection.
static void removeServerPeer(const Connection &server_peer) noexcept
Removes a server connection.
A move-only structure used in GNet::Server::newPeer() and containing the new socket.
An abstract base class for the GNet::Server's connection to a remote client.
void expect(std::size_t)
Modifies the line buffer state so that it delivers a chunk of non-line-delimited data.
void addReadHandler()
Re-adds the socket() read handler.
void dropReadHandler()
Drops the socket() read handler.
~ServerPeer() override
Destructor.
bool secureAcceptCapable() const
Returns true if secureAccept() is usable.
void secureAccept()
Waits for the peer to start a secure session.
Address peerAddress() const override
Returns the peer address.
std::string connectionState() const override
Returns the connection state display string.
void doOnDelete(const std::string &reason, bool done)
Used by the Server class to call onDelete().
void setIdleTimeout(unsigned int seconds)
Sets the idle timeout.
Address localAddress() const override
Returns the local address.
LineBufferState lineBuffer() const
Returns information about the state of the internal line-buffer.
std::string peerCertificate() const override
Returns the peer's TLS certificate.
bool send(const std::string &data)
Sends data down the socket to the peer.
StreamSocket & socket()
Returns a reference to the client-server connection socket.
void onData(const char *, std::size_t) override
Override from GNet::SocketProtocolSink.
ServerPeer(ExceptionSink, ServerPeerInfo &&, const LineBuffer::Config &)
Constructor.
void finish()
Does a socket shutdown(). See also GNet::Client::finish().
A derivation of GNet::Socket for a stream socket.
static bool enabled() noexcept
Returns true if test features are enabled.
A class like c++17's std::string_view.
A configuration structure for GNet::LineBuffer.