Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
RealmAcceptor.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "AuthSocket.h"
7#include "Log.h"
9#include "RealmAcceptor.h"
10#include <boost/system/error_code.hpp>
11#include <memory>
12
15 _acceptor(_threadGroup.GetIoContext()),
16 _closed(true)
17{
18}
19
24
25bool RealmAcceptor::Open(uint16 port, std::string const& bindIp)
26{
27 if (!Skyfire::Net::OpenTcpAcceptor(_threadGroup.GetIoContext(), _acceptor, port, bindIp, "server.authserver", "auth"))
28 return false;
29
30 _closed = false;
32
33 if (_threadGroup.Start(1) == -1)
34 {
35 Close();
36 return false;
37 }
38
39 return true;
40}
41
43{
44 bool expected = false;
45 if (!_closed.compare_exchange_strong(expected, true))
46 return;
47
49 _threadGroup.StopAndJoin();
50}
51
53{
54}
55
57{
58 if (!_acceptor.is_open())
59 return;
60
61 std::shared_ptr<RealmSocketHandle> clientSocket(new RealmSocketHandle(_threadGroup.GetIoContext()));
62 _acceptor.async_accept(*clientSocket,
63 [this, clientSocket](boost::system::error_code const& error)
64 {
65 HandleAccept(clientSocket, error);
66 });
67}
68
69void RealmAcceptor::HandleAccept(std::shared_ptr<RealmSocketHandle> clientSocket, boost::system::error_code const& error)
70{
71 if (_closed)
72 return;
73
74 if (error)
75 {
76 if (error != boost::asio::error::operation_aborted)
77 SF_LOG_ERROR("server.authserver", "Failed to accept auth socket, error %d", error.value());
78 }
79 else
80 {
81 boost::system::error_code endpointError;
82 boost::asio::ip::tcp::endpoint remoteEndpoint = clientSocket->remote_endpoint(endpointError);
83 std::string remoteAddress = endpointError ? std::string("<unknown>") : remoteEndpoint.address().to_string();
84 uint16 remotePort = endpointError ? 0 : remoteEndpoint.port();
85
86 std::unique_ptr<RealmSocketHandle> socketHandle(new RealmSocketHandle(std::move(*clientSocket)));
87 std::shared_ptr<RealmSocket> socket(new RealmSocket(std::move(socketHandle), remoteAddress, remotePort));
88 socket->set_session(std::unique_ptr<RealmSocket::Session>(new AuthSocket(*socket)));
89 socket->Start();
90 }
91
93}
std::uint16_t uint16
Definition Define.h:78
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
boost::asio::ip::tcp::socket RealmSocketHandle
Definition RealmSocket.h:20
void HandleAccept(std::shared_ptr< RealmSocketHandle > clientSocket, boost::system::error_code const &error)
Skyfire::Asio::IoContextThreadGroup _threadGroup
bool Open(uint16 port, std::string const &bindIp)
boost::asio::ip::tcp::acceptor _acceptor
std::atomic< bool > _closed
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)