31 m_es(es.logging(this)) ,
32 m_address(peer_info.m_address) ,
33 m_socket(
std::move(peer_info.m_socket)) ,
34 m_sp(*this,m_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,m_es) ,
38 m_event_logging_string(eventLoggingString(peerAddress(),peer_info.m_server_peer_config))
40 G_ASSERT( peer_info.m_server !=
nullptr ) ;
41 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 , m_es ) ;
48 m_socket->addOtherHandler( *
this , m_es ) ;
54 G_DEBUG(
"GNet::ServerPeer::dtor: [" <<
this <<
"]: port " << m_address.port() ) ;
61 if( config.log_address && config.log_port )
62 return a.
hostPartString().append(1U,
';').append(std::to_string(a.
port())).append(
": ",2U) ;
63 else if( config.log_address )
65 else if( config.log_port )
66 return std::to_string(a.
port()).append(
": ",2U) ;
78 return m_sp.secureAcceptCapable() ;
84 m_line_buffer.expect( n ) ;
90 G_ASSERT( m_socket !=
nullptr ) ;
96 socket().dropReadHandler() ;
101 socket().addReadHandler( *
this , m_es ) ;
104void GNet::ServerPeer::otherEvent( EventHandler::Reason reason )
106 m_sp.otherEvent( reason , m_config.no_throw_on_peer_disconnect ) ;
109void GNet::ServerPeer::readEvent()
111 if( m_sp.readEvent( m_config.no_throw_on_peer_disconnect ) )
117 G_ASSERT( m_socket !=
nullptr ) ;
118 return m_socket->getLocalAddress() ;
128 return m_address.displayString() ;
133 return m_sp.peerCertificate() ;
138 if( m_config.kick_idle_timer_on_send && m_config.idle_timeout )
139 m_idle_timer.startTimer( m_config.idle_timeout ) ;
140 return m_sp.send( data , 0U ) ;
145 if( m_config.kick_idle_timer_on_send && m_config.idle_timeout )
146 m_idle_timer.startTimer( m_config.idle_timeout ) ;
147 return m_sp.send( data ) ;
153 if( m_config.kick_idle_timer_on_send && m_config.idle_timeout )
154 m_idle_timer.startTimer( m_config.idle_timeout ) ;
155 return m_sp.send( segments , offset ) ;
159void GNet::ServerPeer::writeEvent()
161 if( m_sp.writeEvent() )
167 G_DEBUG(
"GNet::ServerPeer::doOnDelete: reason=[" << reason <<
"]" ) ;
168 onDelete( done ? std::string() : reason ) ;
171void GNet::ServerPeer::onIdleTimeout()
173 std::ostringstream ss ;
174 ss <<
"no activity after " << m_config.idle_timeout <<
"s" ;
175 throw IdleTimeout( ss.str() ) ;
180 if( m_config.idle_timeout )
181 m_idle_timer.startTimer( m_config.idle_timeout ) ;
183 bool fragments = m_line_buffer.transparent() ;
184 m_line_buffer.apply(
this , &ServerPeer::onDataImp , data , size , fragments ) ;
187bool GNet::ServerPeer::onDataImp(
const char * data , std::size_t size , std::size_t eolsize ,
188 std::size_t linesize ,
char c0 )
190 return onReceive( data , size , eolsize , linesize , c0 ) ;
198std::string_view GNet::ServerPeer::eventLoggingString()
const
200 if( m_event_logging_string.empty() )
return {} ;
201 return m_event_logging_string ;
206 m_config.idle_timeout = s ;
207 m_idle_timer.cancelTimer() ;
208 if( m_config.idle_timeout )
209 m_idle_timer.startTimer( m_config.idle_timeout ) ;
219void GNet::ServerPeer::onPeerDisconnect()
The GNet::Address class encapsulates a TCP/UDP transport address.
unsigned int port() const
Returns port part of the address.
std::string hostPartString() const
Returns a printable string that represents the network address.
An interface for GNet classes that define a logging context string.
A lightweight object containing an ExceptionHandler pointer, optional ExceptionSource pointer and opt...
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.
static std::string eventLoggingString(const Address &, const Config &)
Assembles an event logging string for a new ServerPeer object.
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 GNet::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.
ServerPeer(EventState, ServerPeerInfo &&, const LineBuffer::Config &)
Constructor.
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.
void finish()
Does a socket shutdown(). See also GNet::Client::finish().
A derivation of GNet::Socket for a stream socket.
A configuration structure for GNet::LineBuffer.
A configuration structure for GNet::ServerPeer.