aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/PrecompiledHeaders/gamePCH.h1
-rw-r--r--src/server/game/Server/WorldSession.cpp2
-rw-r--r--src/server/game/Server/WorldTcpSession.cpp73
-rw-r--r--src/server/game/Server/WorldTcpSession.h22
-rw-r--r--src/server/worldserver/PrecompiledHeaders/worldPCH.h1
5 files changed, 43 insertions, 56 deletions
diff --git a/src/server/game/PrecompiledHeaders/gamePCH.h b/src/server/game/PrecompiledHeaders/gamePCH.h
index d389c4b360c..c7c6ca5d2d6 100644
--- a/src/server/game/PrecompiledHeaders/gamePCH.h
+++ b/src/server/game/PrecompiledHeaders/gamePCH.h
@@ -1,7 +1,6 @@
//add here most rarely modified headers to speed up debug build compilation
#include "Common.h"
-#include "WorldSocket.h"
#include "MapManager.h"
#include "Log.h"
#include "ObjectAccessor.h"
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 4f3112403db..68f06676fdb 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -292,7 +292,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
}
else
{
- OpcodeHandler &opHandle = opcodeTable[packet->GetOpcode()];
+ OpcodeHandler& opHandle = opcodeTable[packet->GetOpcode()];
try
{
switch (opHandle.status)
diff --git a/src/server/game/Server/WorldTcpSession.cpp b/src/server/game/Server/WorldTcpSession.cpp
index 0efd7ab8042..6fd54fffc17 100644
--- a/src/server/game/Server/WorldTcpSession.cpp
+++ b/src/server/game/Server/WorldTcpSession.cpp
@@ -54,9 +54,7 @@ void WorldTcpSession::HandleSendAuthSession()
void WorldTcpSession::AsyncReadHeader()
{
- auto self(shared_from_this());
-
- _socket.async_read_some(boost::asio::buffer(_readBuffer, sizeof(ClientPktHeader)), [this, self](boost::system::error_code error, size_t transferedBytes)
+ _socket.async_read_some(boost::asio::buffer(_readBuffer, sizeof(ClientPktHeader)), [this](boost::system::error_code error, size_t transferedBytes)
{
if (!error && transferedBytes == sizeof(ClientPktHeader))
{
@@ -76,9 +74,7 @@ void WorldTcpSession::AsyncReadHeader()
void WorldTcpSession::AsyncReadData(size_t dataSize)
{
- auto self(shared_from_this());
-
- _socket.async_read_some(boost::asio::buffer(&_readBuffer[sizeof(ClientPktHeader)], dataSize), [this, self, dataSize](boost::system::error_code error, size_t transferedBytes)
+ _socket.async_read_some(boost::asio::buffer(&_readBuffer[sizeof(ClientPktHeader)], dataSize), [this, dataSize](boost::system::error_code error, size_t transferedBytes)
{
if (!error && transferedBytes == dataSize)
{
@@ -90,31 +86,31 @@ void WorldTcpSession::AsyncReadData(size_t dataSize)
std::string opcodeName = GetOpcodeNameForLogging(opcode);
- WorldPacket* packet = new WorldPacket(opcode, header->size);
+ WorldPacket packet(opcode, header->size);
- packet->resize(header->size);
+ packet.resize(header->size);
- std::memcpy(packet->contents(), &_readBuffer[sizeof(ClientPktHeader)], header->size);
+ std::memcpy(packet.contents(), &_readBuffer[sizeof(ClientPktHeader)], header->size);
switch (opcode)
{
- case CMSG_PING:
- //return HandlePing(*new_pct);
- break;
- case CMSG_AUTH_SESSION:
- if (_worldSession)
- {
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
+ case CMSG_PING:
+ //return HandlePing(*new_pct);
break;
- }
+ case CMSG_AUTH_SESSION:
+ if (_worldSession)
+ {
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
+ break;
+ }
- // sScriptMgr->OnPacketReceive(this, packet);
- HandleAuthSession(*packet);
- break;
- case CMSG_KEEP_ALIVE:
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- //sScriptMgr->OnPacketReceive(this, packet);
- break;
+ sScriptMgr->OnPacketReceive(this, packet);
+ HandleAuthSession(packet);
+ break;
+ case CMSG_KEEP_ALIVE:
+ TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
+ sScriptMgr->OnPacketReceive(this, packet);
+ break;
default:
{
//ACE_GUARD_RETURN(LockType, Guard, m_SessionLock, -1);
@@ -129,15 +125,12 @@ void WorldTcpSession::AsyncReadData(size_t dataSize)
// Catches people idling on the login screen and any lingering ingame connections.
_worldSession->ResetTimeOutTime();
- // WARNING here we call it with locks held.
- // Its possible to cause deadlock if QueuePacket calls back
- _worldSession->QueuePacket(packet);
-
+ // Copy the packet to the heap before enqueuing
+ _worldSession->QueuePacket(new WorldPacket(packet));
break;
}
}
-
AsyncReadHeader();
}
else
@@ -165,7 +158,7 @@ void WorldTcpSession::AsyncWrite(WorldPacket const& packet)
});
}
-int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
+void WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
{
uint8 digest[20];
uint32 clientSeed;
@@ -185,7 +178,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
{
SendAuthResponseError(AUTH_REJECT);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: World closed, denying client (%s).", GetRemoteIpAddress().c_str());
- return -1;
+ return;
}
// Read the content of the packet
@@ -220,7 +213,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
// We can not log here, as we do not know the account. Thus, no accountId.
SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (unknown account).");
- return -1;
+ return;
}
Field* fields = result->Fetch();
@@ -254,7 +247,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs. Original IP: %s, new IP: %s).", fields[2].GetCString(), address.c_str());
// We could log on hook only instead of an additional db log, however action logger is config based. Better keep DB logging as well
sScriptMgr->OnFailedAccountLogin(id);
- return -1;
+ return;
}
}
@@ -286,7 +279,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
{
SendAuthResponseError(AUTH_REJECT);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s attempted to log in using invalid client OS (%s).", address.c_str(), os.c_str());
- return -1;
+ return;
}
// Checks gmlevel per Realm
@@ -318,7 +311,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
SendAuthResponseError(AUTH_BANNED);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (Account banned).");
sScriptMgr->OnFailedAccountLogin(id);
- return -1;
+ return;
}
// Check locked state for server
@@ -329,7 +322,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
SendAuthResponseError(AUTH_UNAVAILABLE);
TC_LOG_INFO("network", "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough");
sScriptMgr->OnFailedAccountLogin(id);
- return -1;
+ return;
}
// Check that Key and account name are the same on client and server
@@ -346,7 +339,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
{
SendAuthResponseError(AUTH_FAILED);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", id, account.c_str(), address.c_str());
- return -1;
+ return;
}
TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.",
@@ -389,13 +382,7 @@ int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
if (wardenActive)
_worldSession->InitWarden(&k, os);
- // Sleep this Network thread for
- // uint32 sleepTime = sWorld->getIntConfig(CONFIG_SESSION_ADD_DELAY);
- // ACE_OS::sleep(ACE_Time_Value(0, sleepTime));
-
sWorld->AddSession(_worldSession);
-
- return 0;
}
void WorldTcpSession::SendAuthResponseError(uint8 code)
diff --git a/src/server/game/Server/WorldTcpSession.h b/src/server/game/Server/WorldTcpSession.h
index fde37a642e5..8b1285b0a85 100644
--- a/src/server/game/Server/WorldTcpSession.h
+++ b/src/server/game/Server/WorldTcpSession.h
@@ -40,14 +40,17 @@ struct ClientPktHeader
#pragma pack(pop)
-class WorldTcpSession : public std::enable_shared_from_this<WorldTcpSession>
+class WorldTcpSession
{
public:
- WorldTcpSession(tcp::socket socket) : _socket(std::move(socket)), _authSeed(static_cast<uint32> (rand32()))
+ WorldTcpSession(tcp::socket socket) :
+ _socket(std::move(socket)), _authSeed(static_cast<uint32> (rand32()))
{
-
}
+ WorldTcpSession(WorldTcpSession const& right) = delete;
+ WorldTcpSession& operator=(WorldTcpSession const& right) = delete;
+
void Start();
const std::string GetRemoteIpAddress() const { return _socket.remote_endpoint().address().to_string(); };
@@ -56,16 +59,15 @@ public:
void CloseSocket() { _socket.close(); };
bool IsOpen() { return _socket.is_open(); };
- void WorldTcpSession::AsyncWrite(WorldPacket const& packet);
+ void AsyncWrite(WorldPacket const& packet);
private:
+ void HandleSendAuthSession();
+ void HandleAuthSession(WorldPacket& recvPacket);
+ void SendAuthResponseError(uint8 code);
- void WorldTcpSession::HandleSendAuthSession();
- int WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket);
- void WorldTcpSession::SendAuthResponseError(uint8 code);
-
- void WorldTcpSession::AsyncReadHeader();
- void WorldTcpSession::AsyncReadData(size_t dataSize);
+ void AsyncReadHeader();
+ void AsyncReadData(size_t dataSize);
tcp::socket _socket;
diff --git a/src/server/worldserver/PrecompiledHeaders/worldPCH.h b/src/server/worldserver/PrecompiledHeaders/worldPCH.h
index 889e3855995..6407485f70b 100644
--- a/src/server/worldserver/PrecompiledHeaders/worldPCH.h
+++ b/src/server/worldserver/PrecompiledHeaders/worldPCH.h
@@ -1,5 +1,4 @@
#include "Common.h"
-#include "WorldSocket.h"
#include "World.h"
#include "Log.h"
#include "Database/DatabaseEnv.h"