query/include/matador/net/acceptor.hpp

175 lines
4.3 KiB
C++

#ifndef MATADOR_ACCEPTOR_HPP
#define MATADOR_ACCEPTOR_HPP
#include "matador/net/export.hpp"
#include "matador/net/handler.hpp"
#include "matador/net/handler_creator.hpp"
#include "matador/net/ip.hpp"
#include "matador/logger/logger.hpp"
#include <functional>
namespace matador {
/**
* The acceptor class is used to accept new connection
* within the reactor dispatcher.
*
* Once a new connection was accepted by the acceptor a
* new handler is created and registered within the reactor
* to handle the established connection
*/
class OOS_NET_API acceptor : public handler, public handler_creator
{
public:
typedef std::function<std::shared_ptr<handler>(tcp::socket sock, tcp::peer endpoint, acceptor *accptr)> t_accept_handler; /**< Shortcut to a function creating a handler on successfully accepted a new connection */
/**
* Default constructor
*/
acceptor();
/**
* Creates an acceptor with the given endpoint. The endpoint
* represents the address on which the acceptor listens for new
* connections
*
* @param endpoint Endpoint to listen for new connections
*/
explicit acceptor(tcp::peer endpoint);
/**
* Creates an acceptor with the given endpoint. The endpoint
* represents the address on which the acceptor listens for new
* connections. The given function is called when a new
* connection was accepted and returns a new handler for
* the new connection.
*
* @param endpoint Endpoint to listen for new connections
* @param on_new_connection Function creating a new handler for each accepted new connection
*/
acceptor(tcp::peer endpoint, t_accept_handler on_new_connection);
/**
* Destructor
*/
~acceptor() override;
/**
* When a new connection is accepted the given function
* is called to create a new handler for the connection
*
* @param on_new_connection Function creating a new handler for the new connection
*/
void accecpt(t_accept_handler on_new_connection);
/**
* Accepts new connection at the given endpoint.
* When a new connection is accepted the given function
* is called to create a new handler for the connection.
*
* @param endpoint Endpoint to listen for new connections
* @param on_new_connection Function creating a new handler for the new connection
*/
void accecpt(const tcp::peer& endpoint, t_accept_handler on_new_connection);
/**
* Opens the acceptor means the socket address of the
* endpoint is bound to the created listing socket
* Then the socket is used for listening for new
* connections.
*/
void open() override;
/**
* Returns the current listening socket fd
*
* @return Listening socket fd
*/
socket_type handle() const override;
/**
* Is called when a new connection wants to
* execute to the endpoint. Once the connection was accepted
* a new connection handler is created and the socket is
* passed to the handler. The handler is then registered
* to the reactor to disptach its read and write events.
*/
void on_input() override;
/**
* Does actually nothing
*/
void on_output() override {}
/**
* Does actually nothing
*/
void on_except() override {}
/**
* Does actually nothing
*/
void on_timeout() override {}
/**
* Does actually nothing
*/
void on_close() override {}
/**
* Closes the listen fd of the acceptor
*/
void close() override;
/**
* Returns always false because new connections
* are indicated as read events.
*
* @return Always false
*/
bool is_ready_write() const override;
/**
* Returns true if the acceptor was opened
* and a listen fd was created.
*
* @return True If a listen socket was created
*/
bool is_ready_read() const override;
/**
* Notifies the acceptor that
* this handler was closed.
*
* @param hndlr Closed handler.
*/
void notify_close(handler *hndlr) override;
std::string name() const override;
public:
/**
* Returns the current endpoint accepting new connection.
*
* @return Current listening endpoint
*/
const tcp::peer& endpoint() const;
private:
tcp::acceptor acceptor_;
tcp::peer endpoint_;
std::string name_ { "acceptor" };
t_accept_handler accept_handler_;
logger log_;
tcp::peer create_client_endpoint() const;
};
}
#endif //MATADOR_ACCEPTOR_HPP