diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-05-04 20:41:22 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-05-04 20:41:22 +0200 |
| commit | 6c92a481a34eb19c7ba751a1f7547a39c3d3a088 (patch) | |
| tree | 60ba27db4ce444a03ca07a5f76792b37834d3adc /src/server/shared/Networking | |
| parent | 3b873add1933ffa6593b2e3d7be2033257cffc62 (diff) | |
Core/Misc: Cleanup worldserver/bnetserver main() functions to run destructors in predictable order
* world/bnet servers will now fail to startup if listen ports are in use
* Restored "Network.OutUBuff" config option lost during boost transition
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..8f598c177d2 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", "Couldn't bind to %s:%u %s", _endpoint.address().to_string(), _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(), _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) { } |
