У меня есть публичный сервер (настроен на инди 10).Некоторые неизвестные клиенты отправляют тысячи сообщений без содержимого, что приводит к изменению использования процессора сервером до 50%.У меня нет брандмауэра на моем сервере, поэтому я попытался заблокировать неизвестных клиентов с помощью следующих кодов:
Это функция, которая работает с таймером:
var
i, j: integer;
begin
IX2 := IX2 + 1;
SetLength(ClientIPs, IX2);
ClientIPs[IX2 - 1] := StrIP;
j := 0;
for i := low(ClientIPs) to high(ClientIPs) do
begin
Application.ProcessMessages;
if ClientIPs[i] = StrIP then
j := j + 1;
end;
if j > 10 then
begin
Result := false;
exit;
end;
Result := true;
И это мой код таймера:
//Reset filtering measures
IX2 := 0;
SetLength(ClientIPs, 0);
Так что я использую его в событии OnExecute:
LogIP := AContext.Connection.Socket.Binding.PeerIP;
if IPFilter(LogIP) <> true then
begin
AContext.Connection.disconnect;
exit;
end;
//Get Data *********
Data := AContext.Connection.IOHandler.ReadLn();
наконец, если клиент отправит много сообщений за короткое время, он будет отключен.но есть проблема .на самом деле, после отключения клиента событие Onexecute все еще работает, и я не могу остановить операцию. Полностью. В любом случае мне нужно полностью заблокировать некоторые IP-адреса.
Спасибо