30#ifndef HORIZON_NETWORKING_ASYNCACCEPTOR_HPP
31#define HORIZON_NETWORKING_ASYNCACCEPTOR_HPP
35#include <boost/asio.hpp>
42using boost::asio::ip::tcp;
54 typedef std::function<void(std::shared_ptr<tcp::socket>, uint32_t thread_index)>
AcceptCallback;
68 AsyncAcceptor(boost::asio::io_context &io_context, std::string
const &listen_ip, uint16_t port)
69 :
_endpoint(boost::asio::ip::address::from_string(listen_ip), port),
70 _acceptor(std::make_shared<tcp::acceptor>(io_context, tcp::endpoint(boost::asio::ip::address::from_string(listen_ip), port))),
87 std::shared_ptr<tcp::socket> socket;
89 uint32_t thread_index;
93 _acceptor->async_accept(*socket, [
this, socket, callback, thread_index] (boost::system::error_code error)
97 socket->non_blocking(
true);
98 callback(std::move(socket), thread_index);
99 }
catch (boost::system::system_error
const &err) {
100 HLog(error) <<
"Networking: AsyncAcceptor failed to initialize client's socket :" << err.what();
114 boost::system::error_code errorCode;
119 HLog(error) <<
"Failed to open acceptor " << errorCode.message().c_str();
126 HLog(error) <<
"Could not bind to " <<
_endpoint.address().to_string().c_str() <<
":" <<
_endpoint.port() <<
" - "
127 << errorCode.message().c_str();
131 _acceptor->listen(boost::asio::socket_base::max_connections, errorCode);
134 HLog(error) <<
"Failed to start listening on " <<
_endpoint.address().to_string().c_str() <<
":" <<
_endpoint.port() <<
" " << errorCode.message().c_str();
151 boost::system::error_code error;
157 HLog(error) <<
"Failed to close acceptor: " << error.message().c_str();
184 std::make_shared<T>(std::move(this->
_socket))->start();
185 }
catch (boost::system::system_error
const &err) {
186 std::cerr <<
"Network Error: failed to retrieve client's remote address " << err.what() << std::endl;
191 this->AsyncAccept<T>();
#define HLog(type)
Definition: Logger.hpp:122
Asynchronous acceptor for sockets.
Definition: AsyncAcceptor.hpp:52
~AsyncAcceptor()
Definition: AsyncAcceptor.hpp:56
void AsyncAccept()
Definition: AsyncAcceptor.hpp:178
AsyncAcceptor(boost::asio::io_context &io_context, std::string const &listen_ip, uint16_t port)
Constructor of the AsyncAcceptor object.
Definition: AsyncAcceptor.hpp:68
std::pair< std::shared_ptr< tcp::socket >, uint32_t > default_socket_factory()
Definition: AsyncAcceptor.hpp:168
void close()
Closes the acceptor across all threads.
Definition: AsyncAcceptor.hpp:144
void async_accept_with_callback(AcceptCallback callback)
Asynchronously accepts sockets and executes a callback function.
Definition: AsyncAcceptor.hpp:85
void set_socket_factory(std::function< std::pair< std::shared_ptr< tcp::socket >, uint32_t >()> &&func)
Sets the socket factory for the acceptor.
Definition: AsyncAcceptor.hpp:165
std::shared_ptr< tcp::acceptor > _acceptor
Definition: AsyncAcceptor.hpp:171
std::function< std::pair< std::shared_ptr< tcp::socket >, uint32_t >()> _socket_factory
Definition: AsyncAcceptor.hpp:174
tcp::endpoint _endpoint
Definition: AsyncAcceptor.hpp:170
std::function< void(std::shared_ptr< tcp::socket >, uint32_t thread_index)> AcceptCallback
Definition: AsyncAcceptor.hpp:54
bool bind()
Binds this instance to an endpoint, to listen for connections.
Definition: AsyncAcceptor.hpp:112
std::atomic< bool > _closed
Definition: AsyncAcceptor.hpp:173
bool is_open()
Definition: AsyncAcceptor.hpp:160
std::shared_ptr< tcp::socket > _socket
Definition: AsyncAcceptor.hpp:172
Definition: Element.hpp:7