aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
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/game
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/game')
-rw-r--r--src/server/game/Server/WorldSocket.cpp4
-rw-r--r--src/server/game/Server/WorldSocket.h2
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp42
-rw-r--r--src/server/game/Server/WorldSocketMgr.h6
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;
};