diff options
| author | Shauren <shauren.trinity@gmail.com> | 2014-09-12 22:09:07 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2014-09-12 22:09:07 +0200 |
| commit | ee0df6aa863480f6e3fb631067971195a82ecc9a (patch) | |
| tree | 572cb618ee41d4b42c0fecb2ea2f29ed6224160c /src/server/game/Server | |
| parent | de4aea093bdb7bba5a3c2aad98a52dfa7d5071e2 (diff) | |
Core/NetworkIO: Applied 4.3.4 changes to "new" network code
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index cb42732b464..83bf2c2fff8 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -36,7 +36,7 @@ std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CON WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr), _initialized(false) { - _headerBuffer.Resize(sizeof(ClientPktHeader)); + _headerBuffer.Resize(2); } void WorldSocket::Start() @@ -46,7 +46,7 @@ void WorldSocket::Start() MessageBuffer initializer; ServerPktHeader header(ServerConnectionInitialize.size(), 0); initializer.Write(header.header, header.getHeaderLength() - 2); - initializer.Write((void*)ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length()); + initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length()); std::unique_lock<std::mutex> dummy(_writeLock, std::defer_lock); QueuePacket(std::move(initializer), dummy); @@ -123,15 +123,17 @@ void WorldSocket::ReadHandler() bool WorldSocket::ReadHeaderHandler() { - ASSERT(_headerBuffer.GetActiveSize() == sizeof(ClientPktHeader)); + ASSERT(_headerBuffer.GetActiveSize() == (_initialized ? sizeof(ClientPktHeader) : 2)); - _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), sizeof(ClientPktHeader)); + _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), _headerBuffer.GetActiveSize()); ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer()); EndianConvertReverse(header->size); - EndianConvert(header->cmd); - if (!header->IsValidSize() || !header->IsValidOpcode()) + if (_initialized) + EndianConvert(header->cmd); + + if (!header->IsValidSize() || (_initialized && !header->IsValidOpcode())) { if (_worldSession) { @@ -147,7 +149,9 @@ bool WorldSocket::ReadHeaderHandler() return false; } - header->size -= sizeof(header->cmd); + if (_initialized) + header->size -= sizeof(header->cmd); + _packetBuffer.Resize(header->size); return true; } @@ -221,9 +225,7 @@ bool WorldSocket::ReadDataHandler() } else { - ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer()); - - std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), header->size); + std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), std::min(_packetBuffer.GetActiveSize(), ClientConnectionInitialize.length())); if (initializer != ClientConnectionInitialize) { CloseSocket(); @@ -231,6 +233,8 @@ bool WorldSocket::ReadDataHandler() } _initialized = true; + _headerBuffer.Resize(sizeof(ClientPktHeader)); + _packetBuffer.Reset(); HandleSendAuthSession(); } |
