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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 17:19   #541
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Ckomoroh Посмотреть сообщение
Ошибки теперь нет, но теперь сервер абсолютно не принимает никаких буферов.
В программировании чудес не бывает, покажи что исправил, полный код таймера, ...еще не мешало бы видеть отправку с клиента.

Shouldercannon, проверку в таймере, перед обработкой. Т.е. получили длину, проверили на выход за предел (установите лимит символов). Считали пакет в буфер, проверили на соответствие первого символа числу. Проверили в Case все типы команд и длину буфера, которая должна соответствовать такой команде. Если все корректно, пропускать в обработку, иначе, на любом шаге помечать нарушение, считать их и проверять на лимит, если нарушений подряд много - блокировать клиента или выпинывать его, с занесением в список бана по-IP. Может быть сбои в сети, поэтому нужен счетчик для каждого пользователя, который отсчитывает паузы между некорректными пакетами, и обнуляет нарушения.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 09.08.2010, 23:33   #542
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Данный способ отсылки верно построен?
Код:
                // Отправка IP юзера
                2: begin
                  UserIPs := '';

                  // Зададим ник
                  UserIPNick := Copy(text, 3, Length(text));

                  // Поиск ника в UserMas
                  for i3 := 1 to ServerSocket.Socket.ActiveConnections do
                    begin
                      if UserMas[i3].Name = UserIPNick then
                        begin
                          // Получим IP юзера
                          UserIP := ServerSocket.Socket.Connections[i3 - 1].RemoteAddress;

                          // Добавляем IP юзера в TStringList
                          if UserIP = '127.0.0.1' then
                            Exit;

                          UserIPs := UserIPs + UserIP + '; ';
                        end;
                    end;

                  if UserIPs <> '' then
                    begin
                      // Отобразим сообщение в ChatView
                      ChatView.AddTextFromNewLine('[' + TimeToStr(Now) + '] ', 1);
                      ChatView.AddText('Ник: ' + UserIPNick + ' имеет IP-адрес(а): ', 2);
                      ChatView.AddText(UserIPs, 3);

                      ChatView.Format;

                      RVEChatAutoscroll;

                      // Создаем цикл перебора пользователей
                      for k := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                        begin
                          // Если пользователь найден
                          if UserMas[k + 1].Name = UserMas[i].Name then
                            begin
                              // Отсылаем сообщение в канал приватного пользователя
                              ServerSocket.Socket.Connections[k].SendText('11' + UserMas[i].Name + Chr(152) + UserIPs);
                              // Сбрасываем цикл
                              Break;
                            end;
                        end;
                    end;
                end;

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

Код:
  // Отправка IP юзера
  2: begin
... к какому типу команд относится, ...что присылает по коду 2 клиент?

Запрещается выполнять отправку пакетов с сервера, в момент поступления системных данных от клиента, ...системные данные это: запрос на идентификацию, ответ клиента на идентификацию. В этих двух случаях сервер занят рассылкой запросов и рассылкой списка пользователей, в этот момент возможны случаи получения слепленных пакетов, и клиенты могут "не услышать" управленческие команды, на бан, выпинывание, изменения параметров и статусов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.08.2010, 16:45   #544
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

1.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Код:
  // Отправка IP юзера
  2: begin
... к какому типу команд относится, ...что присылает по коду 2 клиент?

Запрещается выполнять отправку пакетов с сервера, в момент поступления системных данных от клиента, ...системные данные это: запрос на идентификацию, ответ клиента на идентификацию. В этих двух случаях сервер занят рассылкой запросов и рассылкой списка пользователей, в этот момент возможны случаи получения слепленных пакетов, и клиенты могут "не услышать" управленческие команды, на бан, выпинывание, изменения параметров и статусов.
// Тип системные команды имеет начальный код 4 и того 42.
Клиент отсылает
Код:
ClientSocket.Socket.SendText('42' + UserListView.Selected.Caption);
Работает нормально, просто решил подстраховаться, так как что не сделаю на Socket какая-нибудь ошибка полюбому будет.

2.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
В программировании чудес не бывает, покажи что исправил, полный код таймера, ...еще не мешало бы видеть отправку с клиента.

Shouldercannon, проверку в таймере, перед обработкой. Т.е. получили длину, проверили на выход за предел (установите лимит символов). Считали пакет в буфер, проверили на соответствие первого символа числу. Проверили в Case все типы команд и длину буфера, которая должна соответствовать такой команде. Если все корректно, пропускать в обработку, иначе, на любом шаге помечать нарушение, считать их и проверять на лимит, если нарушений подряд много - блокировать клиента или выпинывать его, с занесением в список бана по-IP. Может быть сбои в сети, поэтому нужен счетчик для каждого пользователя, который отсчитывает паузы между некорректными пакетами, и обнуляет нарушения.
Значит начинать надо отсюда
Код:
          // Условие, что пакет не пуст
          if text <> '' then
Под проверкой на лимит символов имеется ввиду тип команды и подкоманда? Если да, то лимит 2.
Цитата:
Считали пакет в буфер
не понял в какой буфер.

Последний раз редактировалось Shouldercannon; 10.08.2010 в 17:41.
Shouldercannon вне форума Ответить с цитированием
Старый 10.08.2010, 19:12   #545
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
Значит начинать надо отсюда

Код:
// Условие, что пакет не пуст
if text <> '' then
Да, в теле этого условия.
Проверка на лимит первая - это сколько символов в одном сообщении допускается передавать, плюс к этому учет, какой длины может быть список пользователей, по максимальной длине ников, ...это будет лимит пакета. Если это условие проходит, в нем еще условие дальнейшей обработки, ...пока не доберетесь до последнего соответствия, а там прыжок в процедуру обработки. Ложность какого-либо из условий проверки - прыжок в конец таймера, с предварительной записью данных о клиенте, вызвавшем нарушение протокола, и соответствующие санкции в его отношении.

Код:
text := ServerSocket.Socket.Connections[i-1].ReceiveText();
text - это буфер.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.08.2010 в 19:15.
Beermonza вне форума Ответить с цитированием
Старый 10.08.2010, 19:21   #546
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Да, в теле этого условия.
Проверка на лимит первая - это сколько символов в одном сообщении допускается передавать, плюс к этому учет, какой длины может быть список пользователей, по максимальной длине ников, ...это будет лимит пакета. Если это условие проходит, в нем еще условие дальнейшей обработки, ...пока не доберетесь до последнего соответствия, а там прыжок в процедуру обработки. Ложность какого-либо из условий проверки - прыжок в конец таймера, с предварительной записью данных о клиенте, вызвавшем нарушение протокола, и соответствующие санкции в его отношении.

Код:
text := ServerSocket.Socket.Connections[i-1].ReceiveText();
text - это буфер.
В одном сообщении допускается передавать 2000 символов. Максимальная длина ника 26 символов. Вот какой длины может быть список пользователей даже не знаю как определить. Под прыжком подразумевается Go To?

Последний раз редактировалось Shouldercannon; 10.08.2010 в 19:47.
Shouldercannon вне форума Ответить с цитированием
Старый 10.08.2010, 19:56   #547
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Проверка на лимит нужна для того чтобы пользователь не отправил на сервер пакет более 5кВ, на нем и остановитесь, или посчитайте максимальное число пользователей, ...26 символов на ник - это много, 20 хватит, нефиг писать в нике поэмы.
Прыжок - GoTo (вместе).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.08.2010, 21:06   #548
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Проверка на лимит нужна для того чтобы пользователь не отправил на сервер пакет более 5кВ, на нем и остановитесь, или посчитайте максимальное число пользователей, ...26 символов на ник - это много, 20 хватит, нефиг писать в нике поэмы.
Прыжок - GoTo (вместе).
Поставил максимальное количество 20.
Цитата:
посчитайте максимальное число пользователей
количество ставить от балды или конкретно высчитывать?
Shouldercannon вне форума Ответить с цитированием
Старый 10.08.2010, 21:20   #549
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

На сколько хотите пользователей ограничить по числу, такой лимит и выбирайте, ...10, 50, 100, 200 и т.д.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 11.08.2010, 00:07   #550
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Теперь перейдём к коду.
Код:
if length(text) > 2000 {20 символов * 20 ников} then
// Действие
Из поста 547
Цитата:
Проверка на лимит нужна для того чтобы пользователь не отправил на сервер пакет более 5кВ, на нем и остановитесь, или посчитайте максимальное число пользователей
Совсем запутался. Что всётаки проверять ники или длину пакета?
P.S. Несколько раз перечитыв пост 541 так и не понял принцип работы проверки на подлинность. Или может сделать если в пакете первые два байта не числа, то выгнать из процедуры или я неправильно мыслю?

Последний раз редактировалось Shouldercannon; 11.08.2010 в 12:53.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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