Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2010, 20:07   #371
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

//Server
Код:
...
BanMas: array[0..255] of string;
...
procedure TForm1.ServerTimerTimer(Sender: TObject);
...
            {Обработка забаненых IP}
            for n := 0 to 255 do
              begin
                if BanMas[n] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                  ServerSocket.Socket.Connections[i - 1].SendText('4'); //Отправка команды забаненому юзеру
//Client
Код:
procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
...
            {Блокируем элементы управления забаненого}
            4: begin
              MMessage.Clear;
                MMessage.Text := 'Бан чата';
                  BlockingControl;
            end;
Вот при таком расладе идёт ддос как сервера (постоянная отсылка клиенту 4) так и клиента (постоянно обрабатывая команду 4)
Shouldercannon вне форума Ответить с цитированием
Старый 20.05.2010, 20:38   #372
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Shouldercannon, внимательнее! Я два раза указал в тексте куда поместить проверку. Вот структура опроса клиентов:

Код:
procedure TForm1.ServerTimerTimer(Sender: TObject);
begin
// условие на наличие установленных каналов
  If ServerSocket.Socket.ActiveConnections > 0 then
    Begin
// цикл по существующим каналам
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
// сохраним пакет (если ничего не прислали, по пакет пустой)
          text:=ServerSocket.Socket.Connections[i-1].ReceiveText();
// условие, что пакет не пуст
          If text<>'' then
            Begin
// получим код комманды, длину строки
              com:=StrToInt(Copy(text,1,1));
              len:=Length(text)-1;
// определение комманд
              Case com of
// код приема сообщения --------------------------------------------------------
                0: Begin
                      .......
                   end;
// -----------------------------------------------------------------------------
// код приема ника клиента -----------------------------------------------------
                1: Begin
// запишем в массив полученный ник
                     UserMas[i].Name:=Copy(text,2,len);

                    > тут проверка списка бана и действие,
                    либо впускать и блокировать, либо полное выпинывание <

// отметим, что пользователь записан в список
                     UserMas[i].Rec:=True;       // для блока нужен, для выпинывания - нет
// отметим авторизацию счетчиком
                     Inc(Autores);                    // аналогично
                   end;
// -----------------------------------------------------------------------------
// код приема приватного сообщения ---------------------------------------------
                3: Begin
                      .......
                   end;
              end;
          end;
       end;
    end;
  end;
При подключении или отключении какого-либо клиента сервер проверит всех клиентов, запросит ник, проверит всех на бан и успокоится.

Если проверка вне структуры Case, то оно и будет стрелять запросами с каждым тактом таймера.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 20.05.2010 в 20:43.
Beermonza вне форума Ответить с цитированием
Старый 21.05.2010, 03:00   #373
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
                              {Код приема ника клиента}
                              1: begin
                                {Запишем в массив полученный ник}
                                UserMas[i].Name := Copy(text, 2, len);
                                  {Обработка забаненых IP}
                                  for n := 0 to 255 do
                                    begin
                                      if BanMas[n] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                                        ServerSocket.Socket.Connections[i - 1].SendText('4');
                                    end;
                                      {Отметим, что пользователь записан в список}
                                      UserMas[i].Rec := True;
                                        {Обновляем список}
                                        UpdateUserList;
                              end;
Спасибо теперь ддоса нет. Но при каждом новом коннекте юзера во время проверки на бан происходит 257 отправок '4'. Думаю, что вот в этом месте идёт сражу проверка и рассылка
Код:
{Обработка забаненых IP}
for n := 0 to 255 do
А может так и должно быть?
И как выполнить проверку BanMas на пустоту, чтобы небыло проверки клиента на бан если BanMas пуст?

Последний раз редактировалось Shouldercannon; 21.05.2010 в 14:45.
Shouldercannon вне форума Ответить с цитированием
Старый 21.05.2010, 16:31   #374
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Если BanMas пуст, то условие:
Код:
 if BanMas[n] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                                        ServerSocket.Socket.Connections[i - 1].SendText('4');
не сработает и ничего отсылаться не будет, пусть цикл хот до 1000000, ...это только нагрузит процессор счетом.

Вот эта запись странная:
Код:
{Обновляем список}
UpdateUserList;
...обновление идет в конце цикла таймера автоматически:

Код:
// разрешение выполнения процедуры обновления массива
  If UpdMas = True then
    Begin
// обновляем массив пользователей
      UpdateUserMas;
// блокируем разрешение
      UpdMas := False;
// разрешаем обновление списка
      UpdList := True;
    end;

// разрешение выполнения процедуры обновления списка
  If UpdList = True then
    Begin
// если все пользователи авторизованы
      If Autores = ServerSocket.Socket.ActiveConnections then
        Begin
// обновляем список пользователей
          UpdateUserList;
// блокируем разрешение
          UpdList := False;
        end;
    end;
За обновление отвечает флаг UpdMas, он при истинности в любой из процедур определяет нужность обновления, которое происходит строго в конце цикла таймера опроса, и лавинно запускает обновление как самого массива так и списка. Если выполнить обновление не этим флагом, то могут возникать исключения, ошибки, зацикливания и неправильные определения подключившихся и отключившихся клиентов.
Кроме того в Case 1: существует запись:

Код:
Inc(Autores);
...которая подсчитывает авторизированных пользователей, без нее обновление списка не произойдет. А вы заменили ее сразу на обновление UpdateUserList вопреки правилам последовательности.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 21.05.2010, 17:00   #375
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Если BanMas пуст, то условие:
Код:
if BanMas[n] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
ServerSocket.Socket.Connections[i - 1].SendText('4');
не сработает и ничего отсылаться не будет, пусть цикл хот до 1000000, ...это только нагрузит процессор счетом.
А где сама проверка?
Цитата:
Вот эта запись странная:
Код:
{Обновляем список}
UpdateUserList;
...обновление идет в конце цикла таймера автоматически:
Код:
// разрешение выполнения процедуры обновления массива
  If UpdMas = True then
    Begin
// обновляем массив пользователей
      UpdateUserMas;
// блокируем разрешение
      UpdMas := False;
// разрешаем обновление списка
      UpdList := True;
    end;

// разрешение выполнения процедуры обновления списка
  If UpdList = True then
    Begin
// если все пользователи авторизованы
      If Autores = ServerSocket.Socket.ActiveConnections then
        Begin
// обновляем список пользователей
          UpdateUserList;
// блокируем разрешение
          UpdList := False;
        end;
    end;
За обновление отвечает флаг UpdMas, он при истинности в любой из процедур определяет нужность обновления, которое происходит строго в конце цикла таймера опроса, и лавинно запускает обновление как самого массива так и списка. Если выполнить обновление не этим флагом, то могут возникать исключения, ошибки, зацикливания и неправильные определения подключившихся и отключившихся клиентов.
Кроме того в Case 1: существует запись:
Код:
Inc(Autores);
Виноват. Перестал следить за новыми сообщениями в теме и не был в курсе, что были внесены ещё изменения. Теперь в курсе и исправил соответсвующий код, но возник вопрос
Код:
UpdList
на замену чему пришёл (в проекте говорится, что не зарегистрирован данный код)?
Дополнительные вопросы:
1. С клиентской части можно банить юзеров?
2. Socket выдаёт только внешний IP?

Последний раз редактировалось Shouldercannon; 22.05.2010 в 15:45.
Shouldercannon вне форума Ответить с цитированием
Старый 22.05.2010, 16:29   #376
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
А где сама проверка?
Сама проверка это цикл по n от 0 до 255, а условие проверки это сравнивание BanMas[n] с взятым по месту канала IP-адресом. Если ячейки массива BanMas пустые, то сравнивание пустоты с IP-адресом типа ХХ.ХХХ.ХХХ.ХХХ вернет ложность, и задание отправлять пакет не будет выполняться. Там где показал красным цветом, там и должна быть проверка.

В самой последней верии 2.0, которая выложена в этой теме UpdList присутствует, ...хотя нет,это обновление (смотрите на 20-х страницах). Флаг введен с целью разграничения во времени обновления массива и списка, до полного определения подключившихся клиентов, и кроме того, оперативного оповещения в будущем состояния пользователей (статусы), в самой версии она выполняет первичное обновление, следом за обновлением массива пользователей. Если потребуется сменить статус, клиент пришлет запрос, сервер проверит и выполнит UpdList := True, всем разошлется строка пользователей с новыми статусами. Но это все нужно организовать. Не помню точно, вроде кто-то уже спрашивал про статусы, возможно в теме есть примеры.

Цитата:
Сообщение от Shouldercannon
Дополнительные вопросы:
1. С клиентской части можно банить юзеров?
2. Socket выдаёт только внешний IP?
1. С клиентской части заведовать командами сервера невозможно.
2. Да, только внешний.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 22.05.2010 в 16:46.
Beermonza вне форума Ответить с цитированием
Старый 22.05.2010, 17:29   #377
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Упоминания
Код:
UpdList
25 страница, пост #246
34 страница, пост #339
но что это процедура или boolean не указывается, даже ни в одном исходнике нет.
Shouldercannon вне форума Ответить с цитированием
Старый 22.05.2010, 19:00   #378
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Это такой же флаг, как и UpdMas - переменная типа Boolean.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.05.2010, 19:21   #379
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Прописал как
Код:
UpdList: Boolean;
работае пока нормально
Shouldercannon вне форума Ответить с цитированием
Старый 24.05.2010, 15:29   #380
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Kappi4, еще раз, задайте вопрос по русски, я не понимаю этого безобразия, ранее адресованного мне.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17