void WorldSocket::OnRead() { for(;;) { // Check for the header if we don't have any bytes to wait for. if(mRemaining == 0) { if(GetReadBuffer().GetSize() < 6) { // No header in the packet, let's wait. return; } // Copy from packet buffer into header local var ClientPktHeader Header; GetReadBuffer().Read(&Header, 6); // Decrypt the header _crypt.DecryptSixRecv((uint8*)&Header); mRemaining = mSize = ntohs(Header.size) - 4; mOpcode = Header.cmd; } WorldPacket * Packet; if(mRemaining > 0) { if( GetReadBuffer().GetSize() < mRemaining ) { // We have a fragmented packet. Wait for the complete one before proceeding. return; } } Packet = new WorldPacket(mOpcode, mSize); Packet->resize(mSize); if(mRemaining > 0) { // Copy from packet buffer into our actual buffer. //Read(mRemaining, (uint8*)Packet->contents()); GetReadBuffer().Read((uint8*)Packet->contents(), mRemaining); } /*sWorldLog.LogPacket(mSize, mOpcode, mSize ? Packet->contents() : NULL, 0);*/ mRemaining = mSize = mOpcode = 0; // Check for packets that we handle switch(Packet->GetOpcode()) { case CMSG_PING: { if(!m_session->m_currentPlayer) { _HandlePing(Packet); delete Packet; } else m_session->m_readQueue.Push(Packet); }break; case CMSG_AUTH_SESSION: { _HandleAuthSession(Packet); }break; default: { if(m_session) m_session->m_readQueue.Push(Packet); else delete Packet; }break; } } }
/// Read the client transmitted data void WorldSocket::OnRead() { TcpSocket::OnRead(); while(1) { ///- Read the packet header and decipher it (if needed) if (!_remaining) { if (ibuf.GetLength() < 6) break; ClientPktHeader hdr; ibuf.Read((char *)&hdr, 6); _crypt.DecryptRecv((uint8 *)&hdr, 6); _remaining = ntohs(hdr.size) - 4; _cmd = hdr.cmd; } if (ibuf.GetLength() < _remaining) break; ///- Read the remaining of the packet WorldPacket packet((uint16)_cmd, _remaining); packet.resize(_remaining); if(_remaining) ibuf.Read((char*)packet.contents(), _remaining); _remaining = 0; ///- If log of world packets is enable, log the incoming packet if( sWorldLog.LogWorld() ) { sWorldLog.Log("CLIENT:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n", (uint32)GetSocket(), packet.size(), LookupName(packet.GetOpcode(), g_worldOpcodeNames), packet.GetOpcode()); uint32 p = 0; while (p < packet.size()) { for (uint32 j = 0; j < 16 && p < packet.size(); j++) sWorldLog.Log("%.2X ", packet[p++]); sWorldLog.Log("\n"); } sWorldLog.Log("\n\n"); } ///- If thepacket is PING or AUTH_SESSION, handle immediately switch (_cmd) { case CMSG_PING: { _HandlePing(packet); break; } case CMSG_AUTH_SESSION: { _HandleAuthSession(packet); break; } default: { ///- Else, put it in the world session queue for this user (need to be already authenticated) if (_session) _session->QueuePacket(packet); else sLog.outDetail("Received out of place packet with cmdid 0x%.4X", _cmd); break; } } } }
void WorldSocket::OnRead() { for(;;) { // Check for the header if we don't have any bytes to wait for. if(mRemaining == 0) { if(GetReadBuffer().GetSize() < 6) { // No header in the packet, let's wait. return; } // Copy from packet buffer into header local var ClientPktHeader Header; GetReadBuffer().Read((uint8*)&Header, 6); // Decrypt the header _crypt.DecryptRecv((uint8*)&Header, sizeof (ClientPktHeader)); #ifdef USING_BIG_ENDIAN mRemaining = mSize = Header.size - 4; mOpcode = swap32(Header.cmd); #else mRemaining = mSize = ntohs(Header.size) - 4; mOpcode = Header.cmd; #endif } WorldPacket * Packet; if(mRemaining > 0) { if( GetReadBuffer().GetSize() < mRemaining ) { // We have a fragmented packet. Wait for the complete one before proceeding. return; } } Packet = new WorldPacket( static_cast<uint16>( mOpcode ), mSize); Packet->resize(mSize); if(mRemaining > 0) { // Copy from packet buffer into our actual buffer. ///Read(mRemaining, (uint8*)Packet->contents()); GetReadBuffer().Read((uint8*)Packet->contents(), mRemaining); } sWorldLog.LogPacket(mSize, static_cast<uint16>( mOpcode ), mSize ? Packet->contents() : NULL, 0, (mSession ? mSession->GetAccountId() : 0) ); mRemaining = mSize = mOpcode = 0; // Check for packets that we handle switch(Packet->GetOpcode()) { case CMSG_PING: { _HandlePing(Packet); delete Packet; }break; case CMSG_AUTH_SESSION: { _HandleAuthSession(Packet); }break; default: { if(mSession) mSession->QueuePacket(Packet); else delete Packet; }break; } } }
void WorldSocket::OnRecvData() { for(;;) { // Check for the header if we don't have any bytes to wait for. if(mRemaining == 0) { if(GetReadBuffer()->GetSize() < 6) { // No header in the packet, let's wait. return; } // Copy from packet buffer into header local var ClientPktHeader Header; Read(&Header, 6); // Decrypt the header _crypt.DecryptRecv((uint8*)&Header, sizeof (ClientPktHeader)); mRemaining = mSize = ntohs(Header.size) - 4; mOpcode = Header.cmd; } if(mRemaining > 0) { if( GetReadBuffer()->GetSize() < mRemaining ) { // We have a fragmented packet. Wait for the complete one before proceeding. return; } } WorldPacket *Packet = new WorldPacket(mOpcode, mSize); if(mRemaining > 0) { Packet->resize(mRemaining); Read((uint8*)Packet->contents(), mRemaining); if(!bServerShutdown) sWorld.NetworkStressIn += float(float(mSize+6)/1024); } mRemaining = mSize = mOpcode = 0; // Check for packets that we handle switch(Packet->GetOpcode()) { case CMSG_PING: { _HandlePing(Packet); delete Packet; }break; case CMSG_AUTH_SESSION: { _HandleAuthSession(Packet); }break; default: { if(mSession) mSession->QueuePacket(Packet); else { delete Packet; Packet = NULL; } }break; } } }