aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Networking
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-06-19 04:04:21 -0300
committerariel- <ariel-@users.noreply.github.com>2017-06-19 04:04:21 -0300
commit7874bee7bfb70e0e039f91173cff212e9572de09 (patch)
tree337bda90265f92d4d89187f2261a68c7a717092b /src/server/shared/Networking
parent46cb32c99f51a564313a520841eac81de9de963a (diff)
Core/Misc: Cleanup worldserver/authserver main() functions to run destructors in predictable order
* world/auth servers will now fail to startup if listen ports are in use * Restored "Network.OutUBuff" config option lost during boost transition (cherry picked from commit 6c92a481a34eb19c7ba751a1f7547a39c3d3a088)
Diffstat (limited to 'src/server/shared/Networking')
-rw-r--r--src/server/shared/Networking/AsyncAcceptor.h30
-rw-r--r--src/server/shared/Networking/SocketMgr.h12
2 files changed, 39 insertions, 3 deletions
diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h
index 8a73e6e59fc..7c827ec4454 100644
--- a/src/server/shared/Networking/AsyncAcceptor.h
+++ b/src/server/shared/Networking/AsyncAcceptor.h
@@ -31,7 +31,7 @@ public:
typedef void(*AcceptCallback)(tcp::socket&& newSocket, uint32 threadIndex);
AsyncAcceptor(boost::asio::io_service& ioService, std::string const& bindIp, uint16 port) :
- _acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)),
+ _acceptor(ioService), _endpoint(boost::asio::ip::address::from_string(bindIp), port),
_socket(ioService), _closed(false), _socketFactory(std::bind(&AsyncAcceptor::DefeaultSocketFactory, this))
{
}
@@ -66,6 +66,33 @@ public:
});
}
+ bool Bind()
+ {
+ boost::system::error_code errorCode;
+ _acceptor.open(_endpoint.protocol(), errorCode);
+ if (errorCode)
+ {
+ TC_LOG_INFO("network", "Failed to open acceptor %s", errorCode.message().c_str());
+ return false;
+ }
+
+ _acceptor.bind(_endpoint, errorCode);
+ if (errorCode)
+ {
+ TC_LOG_INFO("network", "Could not bind to %s:%u %s", _endpoint.address().to_string().c_str(), _endpoint.port(), errorCode.message().c_str());
+ return false;
+ }
+
+ _acceptor.listen(boost::asio::socket_base::max_connections, errorCode);
+ if (errorCode)
+ {
+ TC_LOG_INFO("network", "Failed to start listening on %s:%u %s", _endpoint.address().to_string().c_str(), _endpoint.port(), errorCode.message().c_str());
+ return false;
+ }
+
+ return true;
+ }
+
void Close()
{
if (_closed.exchange(true))
@@ -81,6 +108,7 @@ private:
std::pair<tcp::socket*, uint32> DefeaultSocketFactory() { return std::make_pair(&_socket, 0); }
tcp::acceptor _acceptor;
+ tcp::endpoint _endpoint;
tcp::socket _socket;
std::atomic<bool> _closed;
std::function<std::pair<tcp::socket*, uint32>()> _socketFactory;
diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h
index cb836c86db8..523f6794e68 100644
--- a/src/server/shared/Networking/SocketMgr.h
+++ b/src/server/shared/Networking/SocketMgr.h
@@ -39,9 +39,10 @@ public:
{
ASSERT(threadCount > 0);
+ AsyncAcceptor* acceptor = nullptr;
try
{
- _acceptor = new AsyncAcceptor(service, bindIp, port);
+ acceptor = new AsyncAcceptor(service, bindIp, port);
}
catch (boost::system::system_error const& err)
{
@@ -49,6 +50,13 @@ public:
return false;
}
+ if (!acceptor->Bind())
+ {
+ TC_LOG_ERROR("network", "StartNetwork failed to bind socket acceptor");
+ return false;
+ }
+
+ _acceptor = acceptor;
_threadCount = threadCount;
_threads = CreateThreads();
@@ -119,7 +127,7 @@ public:
}
protected:
- SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(1)
+ SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(0)
{
}