class server;
/**
- Basic connection class
+ @brief connection on a server
+
+ on a server every connection to a client is represented as server_connection.
+ a server_connection is abstract, derived classes like socket_server_connection are used.
*/
class server_connection : public connection
{
+ friend class server;
+
private:
int timeout;
int last_action_time;
unsigned int connection_id;
+ void set_server(server* _my_server)
+ { my_server=_my_server; }
+
+ void set_id(unsigned int _connection_id)
+ { connection_id=_connection_id; }
+
protected:
server_connection(int _timeout)
: connection()
server *my_server;
public:
+ /// check if timeout is expired, close connection if so
void check_timeout();
+
+ /// reset the timeout, e.g. if something is received
void reset_timeout();
+
void set_timeout(int _timeout)
{ timeout=_timeout; }
- void set_server(server* _my_server)
- { my_server=_my_server; }
-
- void set_id(unsigned int _connection_id)
- { connection_id=_connection_id; }
+ /// get the id of this connection within the server object
unsigned int get_id()
{ return connection_id; }
};
/**
- Basic server class
+ @brief server base class
+
+ constitutes a server. is abstract, use derived classes like socket_server.
*/
class server
{
next_id=1;
}
+ virtual bool fill_connection_buffers(void)=0;
+
int add_connection(server_connection* newconn);
public:
virtual ~server();
+ /// set the default timeout for new client connections
void set_default_timeout(int _default_timeout)
{ default_timeout=_default_timeout; }
+
+ /// get the current default timeout for client connections
int get_default_timeout(void)
{ return default_timeout; }
+ /// activate logging to the given stream. everything above the given level is logged.
void set_logging(std::ostream *_logstream, log_level_values _log_level)
{
log_level=_log_level;
server_connection* get_connection(unsigned int conn_id);
- virtual void fill_buffer(long long usec_timeout=-1)=0;
+ /** @brief look for new data on all open connections, accept new connections
+ @param usec_timeout wait until new data is found, max timeout usecs.
+ -1: wait endless
+ NULL: no timeout
+ @retval true if new data was found (does not mean that the received data
+ is a complete packet though)
+ */
+ virtual bool fill_buffer(long long usec_timeout=-1)=0;
+
void cleanup();
+ /** @brief get a complete data packet from any client. The packet is removed from the
+ connection buffer.
+ @param[out] data the data package
+ @retval true if packet found
+ */
bool get_packet(std::string& data)
{ unsigned int x; return get_packet(data,x); }
- bool get_packet(std::string& data, unsigned int& conn_id);
- virtual void fill_connection_buffers(void)=0;
+ /** @brief get a complete data packet from any client. The packet is removed from the
+ connection buffer.
+ @param[out] data the data package
+ @param[out] conn_id the connection id we got this packet from
+ @retval true if packet found
+ */
+ bool get_packet(std::string& data, unsigned int& conn_id);
+ /// write a message to the log if logging is enabled
void log(log_level_values level, const std::string& message)
{ log(level,message.c_str()); }
+ /// write a message to the log if logging is enabled
void log(log_level_values level, const char* message);
};