diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-06-19 04:04:21 -0300 |
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2017-06-19 04:04:21 -0300 |
| commit | 7874bee7bfb70e0e039f91173cff212e9572de09 (patch) | |
| tree | 337bda90265f92d4d89187f2261a68c7a717092b /src/server/shared/Networking | |
| parent | 46cb32c99f51a564313a520841eac81de9de963a (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.h | 30 | ||||
| -rw-r--r-- | src/server/shared/Networking/SocketMgr.h | 12 |
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) { } |
