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/authserver/Server | |
| parent | de4aea093bdb7bba5a3c2aad98a52dfa7d5071e2 (diff) | |
Core/NetworkIO: Applied 4.3.4 changes to "new" network code
Diffstat (limited to 'src/server/authserver/Server')
5 files changed, 46 insertions, 20 deletions
diff --git a/src/server/authserver/Server/BattlenetBitStream.h b/src/server/authserver/Server/BattlenetBitStream.h index 82c2a0a6d5d..6a5e366ede5 100644 --- a/src/server/authserver/Server/BattlenetBitStream.h +++ b/src/server/authserver/Server/BattlenetBitStream.h @@ -64,7 +64,7 @@ namespace Battlenet _buffer.resize(length, 0); } - BitStream(MessageBuffer&& buffer) : _writePos(buffer.GetReadyDataSize() * 8), _readPos(0), _buffer(buffer.Move()) + BitStream(MessageBuffer&& buffer) : _writePos(buffer.GetActiveSize() * 8), _readPos(0), _buffer(buffer.Move()) { } diff --git a/src/server/authserver/Server/BattlenetSession.cpp b/src/server/authserver/Server/BattlenetSession.cpp index 2c2026253dc..7abb9df9db9 100644 --- a/src/server/authserver/Server/BattlenetSession.cpp +++ b/src/server/authserver/Server/BattlenetSession.cpp @@ -56,7 +56,7 @@ Battlenet::Session::ModuleHandler const Battlenet::Session::ModuleHandlers[MODUL &Battlenet::Session::HandleResumeModule, }; -Battlenet::Session::Session(tcp::socket&& socket) : Socket(std::move(socket), std::size_t(BufferSizes::Read)), _accountId(0), _accountName(), _locale(), +Battlenet::Session::Session(tcp::socket&& socket) : Socket(std::move(socket)), _accountId(0), _accountName(), _locale(), _os(), _build(0), _gameAccountId(0), _gameAccountName(), _accountSecurityLevel(SEC_PLAYER), I(), s(), v(), b(), B(), K(), _reconnectProof(), _crypt(), _authed(false) { @@ -537,9 +537,9 @@ bool Battlenet::Session::HandleRealmJoinRequest(PacketHeader& header, BitStream& return true; } -void Battlenet::Session::ReadDataHandler() +void Battlenet::Session::ReadHandler() { - BitStream packet(MoveData()); + BitStream packet(std::move(GetReadBuffer())); _crypt.DecryptRecv(packet.GetBuffer(), packet.GetSize()); while (!packet.IsRead()) @@ -581,13 +581,14 @@ void Battlenet::Session::ReadDataHandler() } } - AsyncReadData(size_t(BufferSizes::Read)); + GetReadBuffer().Resize(size_t(BufferSizes::Read)); + AsyncRead(); } void Battlenet::Session::Start() { TC_LOG_TRACE("server.battlenet", "Battlenet::Session::Start"); - AsyncReadData(size_t(BufferSizes::Read)); + AsyncRead(); } void Battlenet::Session::AsyncWrite(ServerPacket* packet) @@ -602,16 +603,15 @@ void Battlenet::Session::AsyncWrite(ServerPacket* packet) packet->Write(); - std::lock_guard<std::mutex> guard(_writeLock); + MessageBuffer buffer; + buffer.Write(packet->GetData(), packet->GetSize()); + delete packet; - _crypt.EncryptSend(packet->GetData(), packet->GetSize()); + std::unique_lock<std::mutex> guard(_writeLock); - bool needsWriteStart = _writeQueue.empty(); + _crypt.EncryptSend(buffer.GetReadPointer(), buffer.GetActiveSize()); - _writeQueue.push(packet); - - if (needsWriteStart) - BattlenetSocket::AsyncWrite(_writeQueue.front()); + QueuePacket(std::move(buffer), guard); } inline void ReplaceResponse(Battlenet::ServerPacket** oldResponse, Battlenet::ServerPacket* newResponse) diff --git a/src/server/authserver/Server/BattlenetSession.h b/src/server/authserver/Server/BattlenetSession.h index f32f97d15e7..2e6c32cbabf 100644 --- a/src/server/authserver/Server/BattlenetSession.h +++ b/src/server/authserver/Server/BattlenetSession.h @@ -51,9 +51,9 @@ namespace Battlenet Read = 0x4000 }; - class Session : public Socket<Session, ServerPacket*> + class Session : public Socket<Session> { - typedef Socket<Session, ServerPacket*> BattlenetSocket; + typedef Socket<Session> BattlenetSocket; public: explicit Session(tcp::socket&& socket); @@ -79,11 +79,8 @@ namespace Battlenet void AsyncWrite(ServerPacket* packet); - bool IsDataReady() const override { return GetDataSize() > 0; } - protected: - void ReadHeaderHandler() override { } - void ReadDataHandler() override; + void ReadHandler() override; private: void _SetVSFields(std::string const& rI); diff --git a/src/server/authserver/Server/BattlenetSessionManager.cpp b/src/server/authserver/Server/BattlenetSessionManager.cpp index e16057ecbf6..91ba2b65094 100644 --- a/src/server/authserver/Server/BattlenetSessionManager.cpp +++ b/src/server/authserver/Server/BattlenetSessionManager.cpp @@ -16,3 +16,22 @@ */ #include "BattlenetSessionManager.h" + +bool Battlenet::SessionManager::StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) +{ + if (!BaseSocketMgr::StartNetwork(service, bindIp, port)) + return false; + + _acceptor->AsyncAcceptManaged(&OnSocketAccept); + return true; +} + +NetworkThread<Battlenet::Session>* Battlenet::SessionManager::CreateThreads() const +{ + return new NetworkThread<Session>[GetNetworkThreadCount()]; +} + +void Battlenet::SessionManager::OnSocketAccept(tcp::socket&& sock) +{ + sBattlenetSessionMgr.OnSocketOpen(std::forward<tcp::socket>(sock)); +} diff --git a/src/server/authserver/Server/BattlenetSessionManager.h b/src/server/authserver/Server/BattlenetSessionManager.h index 454bac96ddb..b5a54438ef1 100644 --- a/src/server/authserver/Server/BattlenetSessionManager.h +++ b/src/server/authserver/Server/BattlenetSessionManager.h @@ -19,6 +19,7 @@ #define BattlenetSessionManager_h__ #include "BattlenetSession.h" +#include "SocketMgr.h" namespace Battlenet { @@ -37,8 +38,10 @@ namespace Battlenet #pragma pack(pop) - class SessionManager + class SessionManager : SocketMgr<Session> { + typedef SocketMgr<Session> BaseSocketMgr; + public: static SessionManager& Instance() { @@ -46,12 +49,19 @@ namespace Battlenet return instance; } + bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) override; + // noop for now, will be needed later to broadcast realmlist updates for example void AddSession(Session* /*session*/) { } void RemoveSession(Session* /*session*/) { } + protected: + NetworkThread<Session>* CreateThreads() const override; + private: + static void OnSocketAccept(tcp::socket&& sock); + std::map<SessionInfo, Session> _sessions; }; } |
