bool MasterClient::OnReceive(RakPeerInterface *peer, Packet *packet)
{
	switch(packet->data[0])
	{
	case ID_NO_FREE_INCOMING_CONNECTIONS:
		OnMasterServerFull();
		return false; // Do not absorb packet
	case ID_DISCONNECTION_NOTIFICATION:
		OnLostConnection();
		return false; // Do not absorb packet
	case ID_CONNECTION_LOST:
		OnLostConnection();
		return false; // Do not absorb packet
	case ID_MODIFIED_PACKET:
		OnModifiedPacket();
		return false;
	case ID_CONNECTION_ATTEMPT_FAILED:
		OnConnectionAttemptFailed();
		return false; // Do not absorb packet
	case ID_MASTER_SERVER_UPDATE_SERVER:
		HandleServerListResponse(packet, false);
		return true; // Absorb packet
	case ID_MASTER_SERVER_SET_SERVER:
		HandleServerListResponse(packet, true);
		return true; // Absorb packet
	case ID_PONG:
		HandlePong(packet);
		return false; // Absorb packet
	case ID_RELAYED_CONNECTION_NOTIFICATION:
		HandleRelayedConnectionNotification(packet);
		return true; // Absorb packet
	}

	return 0;
}
Esempio n. 2
0
bool
cOpenHpiDaemon::HandleData( cConnection *c )
{
  cMessageHeader header;
  void *data = 0;

  int rv = ConnectionReadMsg( c->Fd(), &header, &data, 0 );

  if ( rv )
     {
       if ( data )
	    free( data );

       fprintf( stderr, "cannot read message !\n" );

       return false;
     }

  if ( header.m_type == eMhPong )
     {
       HandlePong( c, header );
       return true;
     }

  cMessageHeader rh;
  void *rd = 0;

  tResult r = HandleMsg( c, header, data, rh, rd );

  if ( data )
       free( data );

  // marshal error ?
  if ( rh.m_len < 0 )
       rv = 1;
  if ( r == eResultReply )
       rv = ConnectionWriteMsg( c->Fd(), &rh, rd );
  else if ( r == eResultError )
       rv = 1;

  if ( rd )
       free( rd );

  return !rv;
}
Esempio n. 3
0
bool MasterServer::OnReceive(RakPeerInterface *peer, Packet *packet)
{

	RakNetStatisticsStruct *rss;
	RakNetTime connectionTime;
	RakNetTime time;
	unsigned serverIndex;
	time = RakNet::GetTime();

	// Quick and dirty flood attack security:
	// If a client has been connected for more than 5 seconds,
	// and has sent more than 1000 bytes per second on average then ban them
	rss=rakPeer->GetStatistics(packet->playerId);
	if (rss)
	{
		connectionTime=time-rss->connectionStartTime;
		if (connectionTime > FLOOD_ATTACK_CHECK_DELAY &&
			(float)(rss->bitsReceived/8) / (float) connectionTime > FLOOD_ATTACK_BYTES_PER_MS)
		{
			rakPeer->CloseConnection(packet->playerId, true,0);
#ifdef _SHOW_MASTER_SERVER_PRINTF
			printf("%s banned for session due to for flood attack\n", (char*)rakPeer->PlayerIDToDottedIP(packet->playerId));
#endif
			rakPeer->AddToBanList(rakPeer->PlayerIDToDottedIP(packet->playerId));

			// Find all servers with this IP and kill them.
			serverIndex=0;
			while (serverIndex < gameServerList.serverList.Size())
			{
				if (gameServerList.serverList[serverIndex]->connectionIdentifier.binaryAddress==packet->playerId.binaryAddress)
				{
					delete gameServerList.serverList[serverIndex];
					gameServerList.serverList.RemoveAtIndex(serverIndex);
				}
				else
					serverIndex++;
			}
		}
	}

	switch(packet->data[0])
	{
	case ID_QUERY_MASTER_SERVER:
		HandleQuery(packet);
		return true;
	case ID_MASTER_SERVER_DELIST_SERVER:
		HandleDelistServer(packet);
		return true;
	case ID_MASTER_SERVER_SET_SERVER:
		HandleUpdateServer(packet);
		return true;
	case ID_PONG:
		HandlePong(packet);
		return false;
	case ID_RELAYED_CONNECTION_NOTIFICATION:
		HandleRelayedConnectionNotification(packet);
		return true;
	}

	return false; // Absorb packet
}