From 4f6db255a23b8d321bea2265295fd09ba3095833 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 21 Jul 2014 18:54:48 +0200 Subject: Core/NetworkIO: Restored world packet compression --- src/server/game/Server/WorldSocket.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index f6ddad5aed9..c5a0584eff3 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -201,16 +201,24 @@ void WorldSocket::AsyncWrite(WorldPacket const& packet) if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(packet, SERVER_TO_CLIENT); - TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress()).c_str(), GetOpcodeNameForLogging(packet.GetOpcode()).c_str()); + WorldPacket* pkt = &packet; + WorldPacket buff; // Empty buffer used in case packet should be compressed + if (_worldSession && packet.size() > 0x400) + { + buff.Compress(_worldSession->GetCompressionStream(), pkt); + pkt = &buff; + } + + TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress()).c_str(), GetOpcodeNameForLogging(pkt->GetOpcode()).c_str()); - ServerPktHeader header(packet.size() + 2, packet.GetOpcode()); + ServerPktHeader header(pkt->size() + 2, pkt->GetOpcode()); _authCrypt.EncryptSend((uint8*)header.header, header.getHeaderLength()); - auto data = new char[header.getHeaderLength() + packet.size()]; + auto data = new char[header.getHeaderLength() + pkt->size()]; std::memcpy(data, (char*)header.header, header.getHeaderLength()); - if (!packet.empty()) - std::memcpy(data + header.getHeaderLength(), (char const*)packet.contents(), packet.size()); + if (!pkt->empty()) + std::memcpy(data + header.getHeaderLength(), (char const*)pkt->contents(), pkt->size()); // Use a shared_ptr here to prevent leaking memory after the async operation has completed std::shared_ptr buffer(data, [=](char* _b) @@ -220,7 +228,7 @@ void WorldSocket::AsyncWrite(WorldPacket const& packet) auto self(shared_from_this()); - boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + packet.size()), [this, self, buffer](boost::system::error_code error, std::size_t /*length*/) + boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + pkt->size()), [this, self, buffer](boost::system::error_code error, std::size_t /*length*/) { if (error) { -- cgit v1.2.3