BlockIpAddress
Материал из Pro-Pawn Wiki
Данная функция была добавлена в SA-MP 0.3z R2-2 и не работает в более ранних версиях. |
Описание:
Блокирует соединения с указанного IP-адреса.
Параметры:
(ip_address[], timems) |
ip_address[] | IP-адрес, связь с которым требуется заблокировать. Поддерживается использование масок (например, маска "192.128.*.*" заблокирует все адреса, которые начинаются с "192.128" ).
|
timems | Время блокировки в миллисекундах. Значение 0 означает вечную блокировку (на самом деле не совсем вечную - см. прим.)
|
Возвращаемое значение:
1
, если строка ip_address
не пустая, иначе 0
.
Пример использования:
new anti_reconnect_ips[MAX_PLAYERS]; // Упакованные IP-адреса игроков.
new anti_reconnect_timestamps[MAX_PLAYERS]; // Время подключения игроков.
new anti_reconnect_max_playerid = -1; // Наибольший ID игрока, подключившегося к серверу.
const ANTI_RECONNECT_INTERVAL = 20; // Время (сек.), через которое разрешается подключаться с одного IP.
const ANTI_RECONNECT_BLOCK_TIME = 60 * 60; // Время (сек.) блокировки IP-адреса при реконнекте.
public OnIncomingConnection(playerid, ip_address[], port)
{
// Если подключается NPC - пропустим его.
if (IsPlayerNPC(playerid))
return;
new time = gettime();
// Упакуем строку с адресом в число. Сравнение чисел происходит быстрее, чем сравнение строк, и если
// на сервере много игроков, время на упаковку в число компенсируется более быстрым поиском адреса.
new o1, o2, o3, o4;
sscanf(ip_address, "p<.>iiii", o1, o2, o3, o4);
new c = (o1 << 24) | (o2 << 16) | (o3 << 8) | o4;
for (new i = 0; i <= anti_reconnect_max_playerid; ++i)
{
// Если под этим IP за последние несколько секунд уже кто-то подключался - блокируем.
if (c == anti_reconnect_ips[i] && time < anti_reconnect_timestamps[i] + ANTI_RECONNECT_INTERVAL)
{
BlockIpAddress(ip_address, ANTI_RECONNECT_BLOCK_TIME * 1000);
printf("[Anti-Reconnect]: Адрес \"%s\" заблокирован", ip_address);
break;
}
}
anti_reconnect_ips[playerid] = c; // Запомним IP-адрес
anti_reconnect_timestamps[playerid] = time; // и время подключения.
if (playerid > anti_reconnect_max_playerid)
anti_reconnect_max_playerid = playerid;
}
new anti_reconnect_timestamps[MAX_PLAYERS]; // Время подключения игроков.
new anti_reconnect_max_playerid = -1; // Наибольший ID игрока, подключившегося к серверу.
const ANTI_RECONNECT_INTERVAL = 20; // Время (сек.), через которое разрешается подключаться с одного IP.
const ANTI_RECONNECT_BLOCK_TIME = 60 * 60; // Время (сек.) блокировки IP-адреса при реконнекте.
public OnIncomingConnection(playerid, ip_address[], port)
{
// Если подключается NPC - пропустим его.
if (IsPlayerNPC(playerid))
return;
new time = gettime();
// Упакуем строку с адресом в число. Сравнение чисел происходит быстрее, чем сравнение строк, и если
// на сервере много игроков, время на упаковку в число компенсируется более быстрым поиском адреса.
new o1, o2, o3, o4;
sscanf(ip_address, "p<.>iiii", o1, o2, o3, o4);
new c = (o1 << 24) | (o2 << 16) | (o3 << 8) | o4;
for (new i = 0; i <= anti_reconnect_max_playerid; ++i)
{
// Если под этим IP за последние несколько секунд уже кто-то подключался - блокируем.
if (c == anti_reconnect_ips[i] && time < anti_reconnect_timestamps[i] + ANTI_RECONNECT_INTERVAL)
{
BlockIpAddress(ip_address, ANTI_RECONNECT_BLOCK_TIME * 1000);
printf("[Anti-Reconnect]: Адрес \"%s\" заблокирован", ip_address);
break;
}
}
anti_reconnect_ips[playerid] = c; // Запомним IP-адрес
anti_reconnect_timestamps[playerid] = time; // и время подключения.
if (playerid > anti_reconnect_max_playerid)
anti_reconnect_max_playerid = playerid;
}
См. также: