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/game | |
| 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/game')
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.h | 2 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocketMgr.cpp | 42 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocketMgr.h | 6 |
4 files changed, 40 insertions, 14 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index bd5b84f24e3..8069220d270 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -202,7 +202,7 @@ void WorldSocket::InitializeHandler(boost::system::error_code error, std::size_t bool WorldSocket::Update() { EncryptablePacket* queued; - MessageBuffer buffer; + MessageBuffer buffer(_sendBufferSize); while (_bufferQueue.Dequeue(queued)) { uint32 packetSize = queued->size(); @@ -212,7 +212,7 @@ bool WorldSocket::Update() if (buffer.GetRemainingSpace() < packetSize + SizeOfServerHeader) { QueuePacket(std::move(buffer)); - buffer.Resize(4096); + buffer.Resize(_sendBufferSize); } if (buffer.GetRemainingSpace() >= packetSize + SizeOfServerHeader) diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 14ce250d622..337ef055e2a 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -87,6 +87,7 @@ public: void SendAuthResponseError(uint32 code); void SetWorldSession(WorldSession* session); + void SetSendBufferSize(std::size_t sendBufferSize) { _sendBufferSize = sendBufferSize; } protected: void OnClose() override; @@ -142,6 +143,7 @@ private: MessageBuffer _headerBuffer; MessageBuffer _packetBuffer; MPSCQueue<EncryptablePacket> _bufferQueue; + std::size_t _sendBufferSize; z_stream_s* _compressionStream; diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 389df8619a1..42f34245adc 100644 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/> + * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -34,6 +34,7 @@ class WorldSocketThread : public NetworkThread<WorldSocket> public: void SocketAdded(std::shared_ptr<WorldSocket> sock) override { + sock->SetSendBufferSize(sWorldSocketMgr.GetApplicationSendBufferSize()); sScriptMgr->OnSocketOpen(sock); } @@ -43,7 +44,7 @@ public: } }; -WorldSocketMgr::WorldSocketMgr() : BaseSocketMgr(), _instanceAcceptor(nullptr), _socketSendBufferSize(-1), m_SockOutUBuff(65536), _tcpNoDelay(true) +WorldSocketMgr::WorldSocketMgr() : BaseSocketMgr(), _instanceAcceptor(nullptr), _socketSystemSendBufferSize(-1), _socketApplicationSendBufferSize(65536), _tcpNoDelay(true) { } @@ -66,18 +67,37 @@ bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string TC_LOG_DEBUG("misc", "Max allowed socket connections %d", max_connections); // -1 means use default - _socketSendBufferSize = sConfigMgr->GetIntDefault("Network.OutKBuff", -1); + _socketSystemSendBufferSize = sConfigMgr->GetIntDefault("Network.OutKBuff", -1); - m_SockOutUBuff = sConfigMgr->GetIntDefault("Network.OutUBuff", 65536); + _socketApplicationSendBufferSize = sConfigMgr->GetIntDefault("Network.OutUBuff", 65536); - if (m_SockOutUBuff <= 0) + if (_socketApplicationSendBufferSize <= 0) { TC_LOG_ERROR("misc", "Network.OutUBuff is wrong in your config file"); return false; } - BaseSocketMgr::StartNetwork(service, bindIp, port, threadCount); - _instanceAcceptor = new AsyncAcceptor(service, bindIp, uint16(sWorld->getIntConfig(CONFIG_PORT_INSTANCE))); + if (!BaseSocketMgr::StartNetwork(service, bindIp, port, threadCount)) + return false; + + AsyncAcceptor* instanceAcceptor = nullptr; + try + { + instanceAcceptor = new AsyncAcceptor(service, bindIp, uint16(sWorld->getIntConfig(CONFIG_PORT_INSTANCE))); + } + catch (boost::system::system_error const& err) + { + TC_LOG_ERROR("network", "Exception caught in WorldSocketMgr::StartNetwork (%s:%u): %s", bindIp.c_str(), port, err.what()); + return false; + } + + if (!instanceAcceptor->Bind()) + { + TC_LOG_ERROR("network", "StartNetwork failed to bind instance socket acceptor"); + return false; + } + + _instanceAcceptor = instanceAcceptor; _acceptor->SetSocketFactory(std::bind(&BaseSocketMgr::GetSocketForAccept, this)); _instanceAcceptor->SetSocketFactory(std::bind(&BaseSocketMgr::GetSocketForAccept, this)); @@ -91,7 +111,9 @@ bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string void WorldSocketMgr::StopNetwork() { - _instanceAcceptor->Close(); + if (_instanceAcceptor) + _instanceAcceptor->Close(); + BaseSocketMgr::StopNetwork(); delete _instanceAcceptor; @@ -103,10 +125,10 @@ void WorldSocketMgr::StopNetwork() void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) { // set some options here - if (_socketSendBufferSize >= 0) + if (_socketSystemSendBufferSize >= 0) { boost::system::error_code err; - sock.set_option(boost::asio::socket_base::send_buffer_size(_socketSendBufferSize), err); + sock.set_option(boost::asio::socket_base::send_buffer_size(_socketSystemSendBufferSize), err); if (err && err != boost::system::errc::not_supported) { TC_LOG_ERROR("misc", "WorldSocketMgr::OnSocketOpen sock.set_option(boost::asio::socket_base::send_buffer_size) err = %s", err.message().c_str()); diff --git a/src/server/game/Server/WorldSocketMgr.h b/src/server/game/Server/WorldSocketMgr.h index 6c6933f156b..3540d8778c1 100644 --- a/src/server/game/Server/WorldSocketMgr.h +++ b/src/server/game/Server/WorldSocketMgr.h @@ -47,6 +47,8 @@ public: void OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) override; + std::size_t GetApplicationSendBufferSize() const { return _socketApplicationSendBufferSize; } + protected: WorldSocketMgr(); @@ -54,8 +56,8 @@ protected: private: AsyncAcceptor* _instanceAcceptor; - int32 _socketSendBufferSize; - int32 m_SockOutUBuff; + int32 _socketSystemSendBufferSize; + int32 _socketApplicationSendBufferSize; bool _tcpNoDelay; }; |
