aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Networking
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-05-04 20:41:22 +0200
committerShauren <shauren.trinity@gmail.com>2017-05-04 20:41:22 +0200
commit6c92a481a34eb19c7ba751a1f7547a39c3d3a088 (patch)
tree60ba27db4ce444a03ca07a5f76792b37834d3adc /src/server/shared/Networking
parent3b873add1933ffa6593b2e3d7be2033257cffc62 (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.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..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)
{
}