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; }
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 }