bool GameServer::DestroyClientConnection(SOCKET sock, DWORD dwErrorCode){ if( !sock ) return false; bool bRet = true; m_lockConnections.Lock(); // Lock int nIndex = m_arrAcceptedSocks.FindValue((void*)sock); if( nIndex != -1 ){ ClientConnection* pConn = (ClientConnection*)m_arrAcceptedSocks.GetData(nIndex); if( !pConn ) { m_arrAcceptedSocks.Delete(nIndex); // Remove socket from list. m_lockConnections.Unlock(); // Unlock return true; } bool bTableConn = pConn->IsTableConnection(); // Set disconnected state. Session* pSess = pConn->GetSession(true); pConn->SetConnected(false); OnDisconnected(pConn, dwErrorCode); if( pSess ){ // Make session connectionless. if( bTableConn ) pSess->SetTableConnection(pConn->GetTableId(), pConn->GetTournamentId(), NULL, true); else pSess->SetConnection(NULL, true); // Release session pointer. SafePointer::Release(pSess); } // Release pointer. SafePointer::Release(pConn); // Destroy session. if( !bTableConn ) Session::DestroySession(pSess); // Remove conection info. m_arrAcceptedSocks.Delete(nIndex); } else bRet = false; m_lockConnections.Unlock(); // Unlock return bRet; }
bool GameServer::DispatchReceivedData(SocketContext* pSockConn, BYTE* pData, DWORD dwSize, bool bIsFirstData){ ASSERT(m_pPacketHandler && pData && dwSize > 0); if( !pData || !dwSize ) return false; ClientConnection* pConn = (ClientConnection*)pSockConn->GetParam(); GrowableMemory mem(0, 0, false); mem.SetReadonlyBuffer(pData, dwSize); if( !pConn ) return false; BasePacket basePacket; int nOffset = 0; int nBufferSize = dwSize; int nSerializedBytes = 0; while( TRUE ){ if( basePacket.Deserialize(&mem) ){ // Success // Handshake must be the only one command accepted while session is not created. if( (basePacket.m_nCode != PacketCodes::_HandShake && basePacket.m_nCode != PacketCodes::_AcquireTableAccess) && pConn->GetSession(false) == NULL ) return false; BasePacket* packet = m_pPacketHandler->CreatePacketByCode(basePacket.m_nCode); ASSERT( packet ); #ifndef _DEBUG if( packet == NULL ) return false; #endif // Deserialize received data into known packet. if( !mem.SetCurrentOffset(nOffset) ) return false; if( !packet->Deserialize(&mem) ) return false; // Handle received packet. OnPacketReceived(pConn, packet); delete packet; nOffset = mem.GetCurrentOffset(); if( nOffset == nBufferSize ) break; } else break; } return true; }