Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
BoostAsioUtils.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
7#include "Log.h"
8
9#include <boost/asio/error.hpp>
10#include <boost/asio/socket_base.hpp>
11
12namespace Skyfire
13{
14namespace Net
15{
16 bool IsWouldBlock(boost::system::error_code const& error)
17 {
18 return error == boost::asio::error::would_block || error == boost::asio::error::try_again;
19 }
20
21 bool OpenTcpAcceptor(boost::asio::io_context& ioContext, boost::asio::ip::tcp::acceptor& acceptor,
22 uint16 port, std::string const& bindAddress, char const* logFilter, char const* logName)
23 {
24 RestartIoContext(ioContext);
25
26 boost::system::error_code error;
27 boost::asio::ip::tcp::resolver resolver(ioContext);
28 boost::asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(
29 bindAddress, std::to_string(port), boost::asio::ip::resolver_base::passive, error);
30
31 if (error)
32 {
33 SF_LOG_ERROR(logFilter, "Invalid %s bind address %s:%u, error %d",
34 logName, bindAddress.c_str(), port, error.value());
35 return false;
36 }
37
38 boost::system::error_code lastError;
39
40 for (boost::asio::ip::tcp::endpoint const& endpoint : endpoints)
41 {
42 acceptor.open(endpoint.protocol(), error);
43 if (error)
44 {
45 lastError = error;
46 continue;
47 }
48
49 acceptor.set_option(boost::asio::socket_base::reuse_address(true), error);
50 if (!error)
51 acceptor.bind(endpoint, error);
52
53 if (!error)
54 acceptor.listen(boost::asio::socket_base::max_listen_connections, error);
55
56 if (!error)
57 acceptor.non_blocking(true, error);
58
59 if (!error)
60 return true;
61
62 lastError = error;
63
64 CloseTcpAcceptor(acceptor);
65 }
66
67 SF_LOG_ERROR(logFilter, "Failed to open %s listener on %s:%u, error %d",
68 logName, bindAddress.c_str(), port, lastError.value());
69 return false;
70 }
71}
72}
std::uint16_t uint16
Definition Define.h:78
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
void RestartIoContext(boost::asio::io_context &ioContext)
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)
bool IsWouldBlock(boost::system::error_code const &error)