20#include <boost/asio/error.hpp>
21#include <boost/asio/steady_timer.hpp>
22#include <boost/system/error_code.hpp>
29 void AsyncAcceptRA(std::shared_ptr<Skyfire::Asio::IoContextExecutor>
const& executor, std::shared_ptr<boost::asio::ip::tcp::acceptor>
const& acceptor);
30 void ScheduleStopCheck(std::shared_ptr<Skyfire::Asio::IoContextExecutor>
const& executor, std::shared_ptr<boost::asio::ip::tcp::acceptor>
const& acceptor,
31 std::shared_ptr<boost::asio::steady_timer>
const& timer);
36 if (!
sConfigMgr->GetBoolDefault(
"Ra.Enable",
false))
40 std::string stringIp =
sConfigMgr->GetStringDefault(
"Ra.IP",
"0.0.0.0");
43 std::shared_ptr<boost::asio::ip::tcp::acceptor> acceptor(
new boost::asio::ip::tcp::acceptor(executor->GetIoContext()));
47 SF_LOG_INFO(
"server.worldserver",
"Starting Skyfire RA on port %d on %s", raPort, stringIp.c_str());
49 AsyncAcceptRA(executor, acceptor);
51 std::shared_ptr<boost::asio::steady_timer> stopTimer(
new boost::asio::steady_timer(executor->GetIoContext()));
52 ScheduleStopCheck(executor, acceptor, stopTimer);
59 SF_LOG_DEBUG(
"server.worldserver",
"Skyfire RA thread exiting");
64 void AsyncAcceptRA(std::shared_ptr<Skyfire::Asio::IoContextExecutor>
const& executor, std::shared_ptr<boost::asio::ip::tcp::acceptor>
const& acceptor)
66 if (!acceptor->is_open())
69 std::shared_ptr<RASocketHandle> clientSocket(
new RASocketHandle(executor->GetIoContext()));
70 acceptor->async_accept(*clientSocket,
71 [executor, acceptor, clientSocket](boost::system::error_code
const& error)
75 if (error != boost::asio::error::operation_aborted)
76 SF_LOG_ERROR(
"commands.ra",
"Skyfire RA failed to accept socket, error %d", error.value());
80 boost::system::error_code endpointError;
81 boost::asio::ip::tcp::endpoint remoteEndpoint = clientSocket->remote_endpoint(endpointError);
82 std::string remote = endpointError ? std::string(
"<unknown>") : remoteEndpoint.address().to_string();
84 SF_LOG_INFO(
"commands.ra",
"Incoming connection from %s", remote.c_str());
86 std::unique_ptr<RASocketHandle> socketHandle(
new RASocketHandle(std::move(*clientSocket)));
87 std::make_shared<RASocket>(executor, std::move(socketHandle), remote)->start();
91 AsyncAcceptRA(executor, acceptor);
95 void ScheduleStopCheck(std::shared_ptr<Skyfire::Asio::IoContextExecutor>
const& executor, std::shared_ptr<boost::asio::ip::tcp::acceptor>
const& acceptor,
96 std::shared_ptr<boost::asio::steady_timer>
const& timer)
98 timer->expires_after(std::chrono::milliseconds(100));
100 [executor, acceptor, timer](boost::system::error_code
const& error)
102 if (error == boost::asio::error::operation_aborted)
112 ScheduleStopCheck(executor, acceptor, timer);
#define SF_LOG_DEBUG(filterType__,...)
#define SF_LOG_ERROR(filterType__,...)
#define SF_LOG_INFO(filterType__,...)
boost::asio::ip::tcp::socket RASocketHandle
void CancelTimer(Timer &timer)
void CloseTcpAcceptor(boost::asio::ip::tcp::acceptor &acceptor)
bool OpenTcpAcceptor(boost::asio::io_context &ioContext, boost::asio::ip::tcp::acceptor &acceptor, uint16 port, std::string const &bindAddress, char const *logFilter, char const *logName)