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

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

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

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

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

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

Вот как сделал я
Есть Memo в который погружаются все забаненые IP
В procedure TForm1.FormCreate(Sender: TObject); идет загрузка забаненых IP из файла
Код:
MBanIPs.Clear;
MBanIPs.Lines.LoadFromFile((ExtractFilePath(Application.ExeName))+'IPBanList.txt');
далее погружаем из Memo данные в массив
Код:
for n:=0 to MBanIPs.Lines.count-1 do
BanMas[n]:=(MBanIPs.Lines[n]);
В var Формы надо прописать
Код:
BanMas: array[0..255] of string;
Далее при коннекте делаю проверку
procedure TForm1.ServerTimerTimer(Sender: TObject);
Код:
// цикл по существующим каналам
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
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;
// сохраним пакет (если ничего не прислали, по пакет пустой)
          text:=ServerSocket.Socket.Connections[i-1].ReceiveText();
После добавления нового IP обновляю массив
Код:
procedure TForm1.UpdateBanMassiv;
var n: integer;
begin
for n:=0 to MBanIPs.Lines.count-1 do
BanMas[n]:=(MBanIPs.Lines[n]);
end;
Цитата:
Сообщение от mnbvcxz11 Посмотреть сообщение
Вот этой кнопкой удаляю клиента
procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnectio ns-1].RemoteAddress;
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnectio ns-1].Close;
UpdDo:= True;
end;

Вот этой кнопкой занашу в мемо1
procedure TForm1.Button2Click(Sender: TObject);
begin
with ServerSocket.Socket do
begin
for i:=0 to activeConnections-1 do
memo1.lines.add(Connections[i].RemoteAddress+':'+IntToStr(Connect ions[i].RemotePort));
end; //

Как дальше запретить этим клиентам т.е. как сделать чтобы на стороне сервера проверялось(или Мемо или Массив записей удаленных)
Тут можно наверно сделать так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].Close;
memo1.lines.add(ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].RemoteAddress);
UpdDo:= True;
//Обновляем массив
end;

Последний раз редактировалось Beermonza; 05.03.2010 в 23:47.
Shouldercannon вне форума Ответить с цитированием
Старый 12.05.2009, 18:14   #142
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
По умолчанию Вопрос про одинаковый логин

На стороне сервера как запретить одинаковые логины имена


Вобще ограничение на количество клиентов есть или нет


Надеюсь код выше не даст при повторном подключении клиенту попасть в чат

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

Ограничений по каналам нет, в реале что-то в районе 30 тыс. но есть ограничение на списки и массивы, там установлен предел 255, значит 256 клиентов одновременно. Возможно расширение.

Если в бан-массиве есть IP-адрес злостного нарушителя, то он в чат не попадет, или если идет управление приложением, то попадет, но будет "заморожен".

Одинаковые логины запрещаются системой регистрации, читайте теорию выше.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.05.2009, 18:43   #144
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
По умолчанию

Вопрос по коду это все писать надо в procedure TForm1.FormCreate(Sender: TObject);

В procedure TForm1.FormCreate(Sender: TObject); идет загрузка забаненых IP из файла

Код:

MBanIPs.Clear;
MBanIPs.Lines.LoadFromFile((Extract FilePath(Application.ExeName))+'IPB anList.txt');

далее погружаем из Memo данные в массив

Код:

for n:=0 to MBanIPs.Lines.count-1 do
BanMas[n]:=(MBanIPs.Lines[n]);
В var Формы надо прописать

Код:

BanMas: array[0..255] of string;
Далее при коннекте делаю проверку
procedure TForm1.ServerTimerTimer(Sender: TObject);


По ответу т.е. где выше на этой же странице или на другой


Одинаковые логины запрещаются системой регистрации, читайте теорию выше.


По ответу

Выполните регистрацию как положено, с паролями. Для этого нужно создать тип команды в которой передается ник и пароль, через знак разделения. После приема сервером пакета регистрации, клиент входит, если ник совпадает или пароль неверный, то посылать ответный пакет под тем же ключом команды и так, пока не будут выполнены все условия. Ну вы сами все понимаете. Сложного ничего нет, начните, я помогу.

Ответ: ник же уже есть
Просто любой клиент может написать такой же ник

Надо чтобы бы клиент не смог внести одинаковое имя в чате

Последний раз редактировалось mnbvcxz11; 12.05.2009 в 19:17.
mnbvcxz11 вне форума Ответить с цитированием
Старый 12.05.2009, 20:56   #145
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Сообщение от mnbvcxz11 Посмотреть сообщение
Вопрос по коду это все писать надо в procedure TForm1.FormCreate(Sender: TObject);

В procedure TForm1.FormCreate(Sender: TObject); идет загрузка забаненых IP из файла

Код:

MBanIPs.Clear;
MBanIPs.Lines.LoadFromFile((Extract FilePath(Application.ExeName))+'IPB anList.txt');

далее погружаем из Memo данные в массив

Код:

for n:=0 to MBanIPs.Lines.count-1 do
BanMas[n]:=(MBanIPs.Lines[n]);
В var Формы надо прописать

Код:

BanMas: array[0..255] of string;
Далее при коннекте делаю проверку
procedure TForm1.ServerTimerTimer(Sender: TObject);


По ответу т.е. где выше на этой же странице или на другой


Одинаковые логины запрещаются системой регистрации, читайте теорию выше.


По ответу

Выполните регистрацию как положено, с паролями. Для этого нужно создать тип команды в которой передается ник и пароль, через знак разделения. После приема сервером пакета регистрации, клиент входит, если ник совпадает или пароль неверный, то посылать ответный пакет под тем же ключом команды и так, пока не будут выполнены все условия. Ну вы сами все понимаете. Сложного ничего нет, начните, я помогу.

Ответ: ник же уже есть
Просто любой клиент может написать такой же ник

Надо чтобы бы клиент не смог внести одинаковое имя в чате
Только это
Вопрос по коду это все писать надо в procedure TForm1.FormCreate(Sender: TObject);

В procedure TForm1.FormCreate(Sender: TObject); идет загрузка забаненых IP из файла
Код:
MBanIPs.Clear;
MBanIPs.Lines.LoadFromFile((ExtractFilePath(Applic ation.ExeName))+'IPBanList.txt');
далее погружаем из Memo данные в массив
Код:
for n:=0 to MBanIPs.Lines.count-1 do
BanMas[n]:=(MBanIPs.Lines[n]);
Shouldercannon вне форума Ответить с цитированием
Старый 12.05.2009, 21:07   #146
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
По умолчанию

Где то я читал на страницах вопрос про клиентов Оповещение активных
и неактивных
Кто-нибудь проверял этот код рабочий (т.е.активные например зеленые(или) неактивные серые
или по картинкам

На свой вопрос ничего не нашол
Надо чтобы бы клиент не смог внести одинаковое имя в чате
mnbvcxz11 вне форума Ответить с цитированием
Старый 13.05.2009, 15:17   #147
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от mnbvcxz11 Посмотреть сообщение
Где то я читал на страницах вопрос про клиентов Оповещение активных
и неактивных
Кто-нибудь проверял этот код рабочий (т.е.активные например зеленые(или) неактивные серые
или по картинкам

На свой вопрос ничего не нашол
Надо чтобы бы клиент не смог внести одинаковое имя в чате
Нарисуйте картинку неактивного пользователя, поместите в ImageList и пользуйте. Задайте на сервере таймер с интервалом 1000 мс и считайте секунды/минуты, если нет ни одного сообщения от пользователя, меняйте значок в листе на неактивный, отсылайте всем новый пакет, особой структуры, в нем по количеству пользователей индексы нужных картинок.

Начните ход мыслей по системе регистрации, там все дела с именами.

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

Последний раз редактировалось Beermonza; 13.05.2009 в 15:20.
Beermonza вне форума Ответить с цитированием
Старый 13.05.2009, 15:39   #148
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
По умолчанию

По ответу

Т.е. автоматически работать небудет
только вручную


Надо чтобы бы клиент не смог внести одинаковое имя в чате
Скажите хотя бы на какой странице смотреть
mnbvcxz11 вне форума Ответить с цитированием
Старый 13.05.2009, 18:05   #149
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Beermonza
Выполните регистрацию как положено, с паролями. Для этого нужно создать тип команды в которой передается ник и пароль, через знак разделения. После приема сервером пакета регистрации, клиент входит, если ник совпадает или пароль неверный, то посылать ответный пакет под тем же ключом команды и так, пока не будут выполнены все условия. Ну вы сами все понимаете. Сложного ничего нет, начните, я помогу.
Популярней. Вот клиент подключился. Выполняется обновление массива процедурой UpdateUserMas, в ней добавляется в запись "Неизвестный", т.к. имя не известно. Там есть строчка: ServerSocket.Socket.Connections[i-1].SendText('1'); - это команда, состоящая из одного ключа "1", мы отправляем клиенту запрос "Кто он такой".
Смотрим клиента, процедура ClientSocketRead. В case видим, что по ключу у нас вот это: 1: ClientSocket.Socket.SendText('1'+Ni kEdit.Text);. Мы приняв запрос сервера на имя отправляем в ответ свой ник, тот, что ввели в поле NikEdit.Text до подключения.
Теперь посмотрим дальше, что делает сервер приняв команду с ключом "1". Процедура ServerTimerTimer. В case по ключу числится вот это:
Код:
// код приема ника клиента -----------------------------------------------------
                1: Begin
// запишем в массив полученный ник
                     UserMas[i].Name:=Copy(text,2,len);
// отметим, что пользователь записан в список
                     UserMas[i].Rec:=True;
// обновляем список
                     UpdateUserList;
                   end;
// -----------------------------------------------------------------------------
Что не хватает для полного счастья? ...легко видеть, что нам тут нужен перебор всего массива, с целью сравнить пришедшее имя: Copy(text,2,len); с уже существующими. Если мы встретили совпадения, пишем break (сбросить цикл) и отправляем команду нового типа, например так: ServerSocket.Socket.Connections[i-1].SendText('5');, разумеется, если вы приняли ключ 5 как коллизию имен. При этом UserMas[i].Rec:=True; и UpdateUserList; выполнять не нужно, пусть сервер "долбит" клиента, пока тот не введет "нормальное" имя.
На клиентской стороне нужно в case добавить пункт "5:", в котором вызов некоторой заготовленной формочки, с полем для ввода ника и кнопочкой "Сменить никнейм". Команда подобна этой: 1: ClientSocket.Socket.SendText('1'+Fo rm3.NewNikEdit.Text);, т.е. мы снова шлем инициализацию, сервер снова выполняет проверку в массиве, не "наткнувшись" на совпадение, сервер записывает никнейм и обновляет список клиентов:
Код:
UserMas[i].Name:=Copy(text,2,len);
UserMas[i].Rec:=True;
UpdateUserList;
UpdateUserList - разошлет всем новый список, изучите эту процедуру, можете вставить первым байтом перед именем очередного клиента - индекс картинки "Активность".
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 13.05.2009 в 18:09.
Beermonza вне форума Ответить с цитированием
Старый 13.05.2009, 18:27   #150
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
По умолчанию

Где эта самая картинка "Активность" она ведь автоматически должна реагировать
Каким образом картинка "Активность" и "Неактивность" будет включаться и отключаться

Последний раз редактировалось mnbvcxz11; 13.05.2009 в 18:36.
mnbvcxz11 вне форума Ответить с цитированием
Ответ


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