Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
WorldSocketAcceptor.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 "
Log.h
"
7
#include "
Network/BoostAsioUtils.h
"
8
#include "
WorldSocketAcceptor.h
"
9
#include "
WorldSocketMgr.h
"
10
#include <boost/asio/error.hpp>
11
#include <boost/system/error_code.hpp>
12
#include <memory>
13
#include <utility>
14
15
WorldSocketAcceptor::WorldSocketAcceptor
() :
16
m_ThreadGroup
(),
17
m_Acceptor
(
m_ThreadGroup
.GetIoContext()),
18
m_Closed
(true)
19
{
20
}
21
22
WorldSocketAcceptor::~WorldSocketAcceptor
()
23
{
24
Close
();
25
}
26
27
bool
WorldSocketAcceptor::Open
(
uint16
port,
const
char
* address)
28
{
29
if
(!
Skyfire::Net::OpenTcpAcceptor
(
m_ThreadGroup
.GetIoContext(),
m_Acceptor
, port, address,
"network"
,
"world"
))
30
return
false
;
31
32
m_Closed
=
false
;
33
AsyncAccept
();
34
35
if
(
m_ThreadGroup
.Start(1) == -1)
36
{
37
Close
();
38
return
false
;
39
}
40
41
return
true
;
42
}
43
44
void
WorldSocketAcceptor::Close
()
45
{
46
bool
expected =
false
;
47
if
(!
m_Closed
.compare_exchange_strong(expected,
true
))
48
return
;
49
50
Skyfire::Net::CloseTcpAcceptor
(
m_Acceptor
);
51
m_ThreadGroup
.StopAndJoin();
52
}
53
54
void
WorldSocketAcceptor::Update
()
55
{
56
}
57
58
void
WorldSocketAcceptor::AsyncAccept
()
59
{
60
if
(!
m_Acceptor
.is_open())
61
return
;
62
63
ReactorRunnable
* reactor =
sWorldSocketMgr
->SelectNetworkThread();
64
std::shared_ptr<boost::asio::ip::tcp::endpoint> remoteEndpoint(
new
boost::asio::ip::tcp::endpoint);
65
66
m_Acceptor
.async_accept(
sWorldSocketMgr
->GetNetworkIoContext(reactor), *remoteEndpoint,
67
[
this
, reactor, remoteEndpoint](boost::system::error_code
const
& error,
auto
socket)
mutable
68
{
69
HandleAccept(reactor, std::move(socket), *remoteEndpoint, error);
70
});
71
}
72
73
void
WorldSocketAcceptor::HandleAccept
(
ReactorRunnable
* reactor,
WorldSocketHandle
socket, boost::asio::ip::tcp::endpoint
const
& remoteEndpoint,
74
boost::system::error_code
const
& error)
75
{
76
if
(
m_Closed
)
77
return
;
78
79
if
(error)
80
{
81
if
(error != boost::asio::error::operation_aborted)
82
SF_LOG_ERROR
(
"network"
,
"Failed to accept world socket, error %d"
, error.value());
83
}
84
else
85
{
86
std::string remoteAddress = remoteEndpoint.address().to_string();
87
88
std::unique_ptr<WorldSocketHandle> socketHandle(
new
WorldSocketHandle
(std::move(socket)));
89
std::unique_ptr<WorldSocket> worldSocket(
new
WorldSocket
(std::move(socketHandle), remoteAddress));
90
if
(
sWorldSocketMgr
->OnSocketOpen(worldSocket.get(), reactor) == -1)
91
worldSocket->CloseSocket();
92
else
93
worldSocket.release();
94
}
95
96
AsyncAccept
();
97
}
BoostAsioUtils.h
uint16
std::uint16_t uint16
Definition
Define.h:78
Log.h
SF_LOG_ERROR
#define SF_LOG_ERROR(filterType__,...)
Definition
Log.h:143
WorldSocketAcceptor.h
WorldSocketMgr.h
ReactorRunnable
Definition
WorldSocketMgr.cpp:35
WorldSocketAcceptor::Open
bool Open(uint16 port, const char *address)
Definition
WorldSocketAcceptor.cpp:27
WorldSocketAcceptor::m_Acceptor
boost::asio::ip::tcp::acceptor m_Acceptor
Definition
WorldSocketAcceptor.h:39
WorldSocketAcceptor::Update
void Update()
Definition
WorldSocketAcceptor.cpp:54
WorldSocketAcceptor::WorldSocketAcceptor
WorldSocketAcceptor()
Definition
WorldSocketAcceptor.cpp:15
WorldSocketAcceptor::m_ThreadGroup
Skyfire::Asio::IoContextThreadGroup m_ThreadGroup
Definition
WorldSocketAcceptor.h:38
WorldSocketAcceptor::m_Closed
std::atomic< bool > m_Closed
Definition
WorldSocketAcceptor.h:40
WorldSocketAcceptor::Close
void Close()
Definition
WorldSocketAcceptor.cpp:44
WorldSocketAcceptor::~WorldSocketAcceptor
~WorldSocketAcceptor()
Definition
WorldSocketAcceptor.cpp:22
WorldSocketAcceptor::AsyncAccept
void AsyncAccept()
Definition
WorldSocketAcceptor.cpp:58
WorldSocketAcceptor::HandleAccept
void HandleAccept(ReactorRunnable *reactor, WorldSocketHandle socket, boost::asio::ip::tcp::endpoint const &remoteEndpoint, boost::system::error_code const &error)
Definition
WorldSocketAcceptor.cpp:73
WorldSocket
Handler that can communicate over stream sockets.
Definition
WorldSocket.h:51
sWorldSocketMgr
#define sWorldSocketMgr
Definition
WorldSocketMgr.h:60
WorldSocketHandle
boost::asio::ip::tcp::socket WorldSocketHandle
Definition
WorldSocket.h:31
Skyfire::Net::CloseTcpAcceptor
void CloseTcpAcceptor(boost::asio::ip::tcp::acceptor &acceptor)
Definition
BoostAsioUtils.h:38
Skyfire::Net::OpenTcpAcceptor
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)
Definition
BoostAsioUtils.cpp:21
src
server
game
Server
WorldSocketAcceptor.cpp
Generated on
for Project SkyFire Core by
1.17.0