示例#1
0
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;
	}
示例#2
0
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;
	}