View Single Post
Old 02/12/2013, 08:00 AM   #123
Slava[LSW]
Big Clucker
 
Join Date: Aug 2010
Location: Russia, Vladivostok
Posts: 99
Reputation: 4
Default Re: Атака сервера

По-моему, лучше отлавливать 'Messages received', и получать разность каждую секунду.
Acks sent постепенно достигнет значения в 3000, и тогда будет плохо.

А 'Messages received', на мой взгляд, самый надежный.

Мой вариант:
pawn Code:
public OnGameModeInit()
{
    SetTimer("AntiDOS", 950, true);
}

new m_per_sec[MAX_PLAYERS];

forward AntiDOS();
public AntiDOS()
{
    new str[268];
    new mes;
    new find;
   
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(IsPlayerConnected(i))
        {
            GetPlayerNetworkStats(i, str, 268);
           
            find = strfind(str, "Messages received:", false, 205);
            if(find != -1)
            {
                mes = strval(str[find+18]);

                if((mes - m_per_sec[i]) >= 500)
                {
                    SetTimerEx("testDos", 200, false, "%d%d", i, (mes - m_per_sec[i]));//Во время выхода игрока с сервера, таймер может сработать, тогда значение подпрыгнет примерно до 115000, это не допустимо
                }

                m_per_sec[i] = mes;
            }
        }
    }
    return true;
}

forward testDos(playerid, messages);
public testDos(playerid, messages)
{
    if(IsPlayerConnected(playerid))
    {
        //Ban(playerid);
    }
    return false;
}

public OnPlayerConnect(playerid)
{
    m_per_sec[playerid] = 2147483647;
}
Slava[LSW] is offline   Reply With Quote