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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2010, 23:05   #471
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Поиск простой. Вот так будет для сервера:
Код:
For j2 := 1 to ServerSocket.Socket.ActiveConnections do
  Begin
    If UserMas[j2].Name = BannedUnbannedNick then
      Begin
        // какие-то процедуры
        ...

        // IP пользователя
        BannedIP := ServerSocket.Socket.Connections[j2 - 1].RemoteAddress;
        // отправка команды на бан
        ServerSocket.Socket.Connections[j2 - 1].SendText('21');
      end;
  end;
Проверяйте.
Работает отлично.

1. Нашёл косяк в системе бана. Если в чате два Васи то при бане второго цикл забанит первого, не того кого нужно. Где нужно запретить вход юзеру с уже имеющимся ников в чате?

2.
Код:
procedure TForm1.Sendprivatemessag1Click(Sender: TObject);
begin
  // Если список пользователей не пустой и выделена запись
  if (UserListView.Items.Count > 0) and (UserListView.SelCount > 0) then
    begin
      // Запишем в поле "Кому" приватного пользователя
      addressee := UserListView.Selected.Caption;
    end;

  RVEMessage.InsertText(UserListView.Items[UserListView.ItemIndex].Caption + ' (приват) ');
  RVEMessage.Reformat;
  RVEMessage.SetFocus;
end;
Запутался. Для address UserListView.Selected.Caption, а для RVEMessage.InsertText UserListView.Items[UserListView.ItemIndex].Caption. UserListView.Selected.Caption или UserListView.Items[UserListView.ItemIndex].Caption использовать?
Выбор через PopupMenu производится.

3. ServerSocket.Socket.Connections[j2 - 1].RemoteAddress почему - 1?

Последний раз редактировалось Shouldercannon; 22.06.2010 в 00:05.
Shouldercannon вне форума Ответить с цитированием
Старый 22.06.2010, 01:04   #472
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
1. Нашёл косяк в системе бана. Если в чате два Васи то при бане второго цикл забанит первого, не того кого нужно. Где нужно запретить вход юзеру с уже имеющимся ников в чате?
При авторизации, процедуре таймера в case 1: запишите проверку на совпадение ника, если сработает, то выкидывайте пользователя.

Цитата:
Сообщение от Shouldercannon
2. Запутался. Для address UserListView.Selected.Caption, а для RVEMessage.InsertText UserListView.Items[UserListView.ItemIndex].Caption. UserListView.Selected.Caption или UserListView.Items[UserListView.ItemIndex].Caption использовать?
Выбор через PopupMenu производится.
Понятия не имею что есть RVEMessage.

Цитата:
Сообщение от Shouldercannon
3. ServerSocket.Socket.Connections[j2 - 1].RemoteAddress почему - 1?
Цикл начинается с 1 до ActiveConnections, массив хранит 1-го клиента в 1-ой ячейке, а номер канала начинается в системе от 0-я, ...отсюда такая арифметика.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.06.2010, 01:52   #473
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

1.
Цитата:
Цитата:Сообщение от Shouldercannon
2. Запутался. Для address UserListView.Selected.Caption, а для RVEMessage.InsertText UserListView.Items[UserListView.ItemIndex].Caption. UserListView.Selected.Caption или UserListView.Items[UserListView.ItemIndex].Caption использовать?
Выбор через PopupMenu производится.

Понятия не имею что есть RVEMessage.
Не обращайте внимания на RVEMessage это RichView. Загвостка в том, что вот здесь
Код:
address := UserListView.Selected.Caption;
а здесь
Код:
RVEMessage.InsertText UserListView.Items[UserListView.ItemIndex].Caption;
и не понятно, толи в обоих случаях использовать UserListView.Selected.Caption или UserListView.Items[UserListView.ItemIndex].Caption. разница в способах получения Caption существенная?

2.
Цитата:
Сообщение от Shouldercannon
1. Нашёл косяк в системе бана. Если в чате два Васи то при бане второго цикл забанит первого, не того кого нужно. Где нужно запретить вход юзеру с уже имеющимся ников в чате?

При авторизации, процедуре таймера в case 1: запишите проверку на совпадение ника, если сработает, то выкидывайте пользователя.
Так буду искать
Код:
// Поиск одиноковых ников
for i := 0 to UserListView.Items.Count - 1 do
  begin
    if Pos(Что сверять?, UserListView.Items.Item[i].Caption) <> 0 then
      ServerSocket.Socket.Connections[i - 1].Close;
  end;
3. Данный способ сможет определить IP юзера забаненного удалённым администратором?
Код:
For j2 := 1 to ServerSocket.Socket.ActiveConnections do
  Begin
    If UserMas[j2].Name = BannedUnbannedNick then
      Begin
        // какие-то процедуры
        ...

        // IP пользователя
        BannedIP := ServerSocket.Socket.Connections[j2 - 1].RemoteAddress;
        // отправка команды на бан
        ServerSocket.Socket.Connections[j2 - 1].SendText('21');
      end;
  end;
P.S. Думаю что да, просто нужно подтверждение.

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

Давайте попытаемся понять, что значит этот код:

Код:
 RVEMessage.InsertText(UserListView.Items[UserListView.ItemIndex].Caption + ' (приват) ');
...почему UserListView.ItemIndex? ...когда первый в списке - сервер, а он канала не имеет, 1-ый клиент на индексе 1, а канал сокета у него 0-ой. Следовательно:

Код:
 RVEMessage.InsertText(UserListView.Items[UserListView.ItemIndex - 1].Caption + ' (приват) ');
ItemIndex - та запись, что стоит выделенной, можно считывать этот индекс, а можно и задавать его, выделение будет перескакивать в указанный индекс.

Selected - указывает на активность выделения записи, т.е. запись может быть не выделена но последний клик был по ней, она в рамочке, и ItemIndex будет указывать на нее. Selected позволяет точно знать, что это именно та запись, активная, по которой производился клик.

Цитата:
Сообщение от Shouldercannon
Так буду искать

Код:
// Поиск одиноковых ников
for i := 0 to UserListView.Items.Count - 1 do
  begin
    if Pos(Что сверять?, UserListView.Items.Item[i].Caption) <> 0 then
      ServerSocket.Socket.Connections[i - 1].Close;
  end;
Нужно ведь искать совпадение ника целиком, так? ...Миша1, Миша1245 - это разные ники? Вавторизации:

Код:
/ код приема ника клиента
                1: Begin
// запишем в массив полученный ник
                     UserMas[i].Name:=Copy(text,2,len);
// отметим, что пользователь записан в список
                     UserMas[i].Rec:=True;
// отметим авторизацию счетчиком
                     Inc(Autores);
                   end;
...ник получается, и прежде чем записывать и авторизировать, нужно проверить весь массив пользователей UserMas на предмет совпадения Copy(text,2,len) и UserMas[j3].Name если найдено совпадение, то закрыть канал, если нет, то продолжить авторизацию.

Цитата:
Сообщение от Shouldercannon
3. Данный способ сможет определить IP юзера забаненного удалённым администратором?
Сервер будет знать все! ...что написано, то и определит, запретов для него не существует, он хозяин и властелин чата.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.06.2010, 18:25   #475
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Нужно ведь искать совпадение ника целиком, так? ...Миша1, Миша1245 - это разные ники? Вавторизации:

Код:

/ код приема ника клиента
1: Begin
// запишем в массив полученный ник
UserMas[i].Name:=Copy(text,2,len);
// отметим, что пользователь записан в список
UserMas[i].Rec:=True;
// отметим авторизацию счетчиком
Inc(Autores);
end;

...ник получается, и прежде чем записывать и авторизировать, нужно проверить весь массив пользователей UserMas на предмет совпадения Copy(text,2,len) и UserMas[j3].Name если найдено совпадение, то закрыть канал, если нет, то продолжить авторизацию.
Не продумал. Если есть Миша 1245, то Миша 1 сервер не пустит, так как совпадение по Миша 1. Тогда система бесполезная.

Последний раз редактировалось Shouldercannon; 22.06.2010 в 18:38.
Shouldercannon вне форума Ответить с цитированием
Старый 22.06.2010, 21:50   #476
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Если есть "Миша1245", то "Миша1" сервер пропустит, т.к. Copy(text,2,len) и UserMas[j3].Name будут проверяться на полное совпадение символов, включая их количество. Эта система правильная, ...поскольку во многих никах есть часть совпадающих подряд символов, не выкидывать же теперь "Миша" потому, что есть уже "Мишаня", совпадение больше 50% символов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 23.06.2010, 00:37   #477
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

1. Так как выбор ника ведётся через PopupMenu, что лучше использовать для внесения выбранного в addressee, поле ввода текста или ещё куда-либо
Код:
 RVEMessage.InsertText(UserListView.Items[UserListView.ItemIndex - 1].Caption);
или
Код:
UserListView.Selected.Caption;
?

2. Реализация запрета входа юзеров с одинаковым ником.
Код:
              // Тип идентификации пользователей
              0: begin
                // Определение комманд
                case com2 of
                // Код приема ника клиента
                0: begin
                  // Проверка на наличие одинаковых ников
                  for i4 := 1 to ServerSocket.Socket.ActiveConnections do
                    begin
                      if UserMas[i4].Name = Copy(text, 3, len) then
                        ServerSocket.Socket.Connections[i4 - 1].Close;
                    end;

                  // Запишем в массив полученный ник
                  UserMas[i].Name := Copy(text, 3, len);

                  // Начало опасного блока, могущего вызывать слипание команд
                  // Обработка забаненых IP
                  for c := 0 to 255 do
                    begin
                      if BanIPMas[c] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                        ServerSocket.Socket.Connections[i - 1].SendText('21');
                    end;
                  // Конец опасного блока

                  // Отметим, что пользователь записан в список
                  UserMas[i].Rec := True;
                  // Отметим авторизацию счетчиком
                  Inc(Autores);

                  // Обработка админов
                  for c := 0 to 255 do
                    begin
                      if AdminIPMas[c] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                        UserMas[i].Admin := True;
                    end;
                end;

                end;
              end;
Получилось очень весело. Запустил клиент и зашёл в чат, далее запустил вторую копию приложения и зашёл в чат и тут началось интересное. При заходе второго клиента был закрыт канал первого у первого естественного сработал reconnect, после чего он попал в чат, а второй был выгнан. В общем один заходит другой выходит после reconnect-а .

3. Вижу в местах где применяется UserMas[k + 1].Name и прочие с UserMas[... + 1].Name есть Breack. Сброс должен приеняться только с данным кодом? А то и здесь сбросы делал (Code.txt)
Вложения
Тип файла: txt Code.txt (5.6 Кб, 146 просмотров)

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

Цитата:
Сообщение от Shouldercannon
1. Так как выбор ника ведётся через PopupMenu, что лучше использовать для внесения выбранного в addressee, поле ввода текста или ещё куда-либо
Код:
RVEMessage.InsertText(UserListView.Items[UserListView.ItemIndex - 1].Caption);
или
Код:
UserListView.Selected.Caption;
?
Если при вызове меню активное выделение (темным цветом) с записи пропадает, то применяйте первый код, если нет, то второй.

Цитата:
Сообщение от Shouldercannon
2. Реализация запрета входа юзеров с одинаковым ником.
Код:
...
// Проверка на наличие одинаковых ников
for i4 := 1 to ServerSocket.Socket.ActiveConnections do
  begin
    if UserMas[i4].Name = Copy(text, 3, len) then ServerSocket.Socket.Connections[i4 - 1].Close;
  end;
...
И снова невнимательность. Нужно четко знать чего хочешь. Поиск ведется в собственном цикле по-i4, ищется совпадение, оно допустим нашлось, ...так какого клиента нужно выкинуть? ...того, кого нашли по-i4 (это пользователь, что уже в чате) или того, кто у нас только вошел и пытается авторизироваться с недопустимым ником по-i ? почему ServerSocket.Socket.Connections[i4 - 1].Close;, когда нарушитель - i, его и выкидываем.
Следует еще поменять местами код на прием ника и проверку на совпадение:
Код:
...
// Запишем в массив полученный ник
UserMas[i].Name := Copy(text, 3, len);
// Проверка на наличие одинаковых ников
for i4 := 1 to ServerSocket.Socket.ActiveConnections do
  begin
    if UserMas[i4].Name = UserMas[i].Name then ServerSocket.Socket.Connections[i - 1].Close;
  end;
...
Цитата:
Сообщение от Shouldercannon
3. Вижу в местах где применяется UserMas[k + 1].Name и прочие с UserMas[... + 1].Name есть Breack. Сброс должен приеняться только с данным кодом?
Break - останавливает цикл, в теле которого он находится, оставляя счетчик на текущей позиции и переходя за цикл на следующий код, ...это как с GoTo, но для частного случая.
Вот счетчик по-t, он считает от 0 до 10. Допустим в теле цикла условие: если t = 5, то Break, что произойдет? ...программа перейдет к следующему коду за циклом, а t останется 5. Где это можно применить? ...при поиске позиции, на которой срабатывает условие. Если цикл от 0 до 1000000 а условие сработает на 5, нужно ли циклу считать дальше? ...не нужно, это расход ресурсов, ...посему применяется сброс, чтобы сразу по срабатыванию условия цикл переставал считать. Это частный случай, когда ищется всего одно совпадение, и остальные на решение уже не влияют. А если нужно считать все совпадения, тогда сброса не требуется.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 23.06.2010, 19:38   #479
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Теперь вообще в чат не пускает при условии что в нём только сервер
Код:
             // Тип идентификации пользователей
              0: begin
                // Определение комманд
                case com2 of
                // Код приема ника клиента
                0: begin
                  // Запишем в массив полученный ник
                  UserMas[i].Name := Copy(text, 3, len);

                  // Проверка на наличие одинаковых ников
                  for i4 := 1 to ServerSocket.Socket.ActiveConnections do
                    begin
                      if UserMas[i4].Name = UserMas[i].Name then
                        ServerSocket.Socket.Connections[i - 1].Close;
                    end;

                  // Начало опасного блока, могущего вызывать слипание команд
                  // Обработка забаненых IP
                  for c := 0 to 255 do
                    begin
                      if BanIPMas[c] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                        ServerSocket.Socket.Connections[i - 1].SendText('21');
                    end;
                  // Конец опасного блока

                  // Отметим, что пользователь записан в список
                  UserMas[i].Rec := True;
                  // Отметим авторизацию счетчиком
                  Inc(Autores);

                  // Обработка админов
                  for c := 0 to 255 do
                    begin
                      if AdminIPMas[c] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                        UserMas[i].Admin := True;
                    end;
                end;

                end;
              end;

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

Проверка на самого себя тоже должна быть:
Код:
// Проверка на наличие одинаковых ников
For i4 := 1 to ServerSocket.Socket.ActiveConnections do
  Begin
    If (UserMas[i4].Name = UserMas[i].Name) And (i4 <> i) then
      Begin
        ServerSocket.Socket.Connections[i - 1].Close;
        Break;
      end;
  end;
Руководитель проекта 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