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

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

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

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

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

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

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Выбираем канал и закрываем его ServerSocket.Socket.Connections[i].Close, после чего идет обновление UpdDo := True
С ServerSocket.Socket.Connections[i].Close поятоянно выдаёт ошибку. Получлось выкидывать юзеров из чата так ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnectio ns-1].Close;
Но при закрытии соединения есть подвох, юзер возвращается обратно в чат благодаря системе переподключения , а этого делать не надо.

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

Естественно ServerSocket.Socket.Connections[i].Close в своем оригинале будет выдавать ошибку, поскольку это пример, в котором i - переменная, которая должна содержать фактический номер канала, который нужно узнать по списку пользователей, образом, уже упоминавшимся выше, в частности на использование привата. Разумеется, я не буду всегда приводить конкретный код для пожелавшего его получить, ...только пример и теоретические знания, чтобы научить самостоятельно находить решения.
Теперь, ...если у вас используется система переподключения, которую я описал выше, то ничего подобного на повторное подключение "откинутого" сервером клиента я не наблюдаю. Возможно что-то в коде вы исправили. Процедура Close серверного сокета корректно отключает канал, это не относится с ошибкам сокета, и посему процедура переподключения просто не срабатывает.
Если имеется в виду ручное переподключение посредством клавишь, то у вас должна быть реализована система бана.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 01.05.2009 в 23:56.
Beermonza вне форума Ответить с цитированием
Старый 02.05.2009, 12:06   #123
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Естественно ServerSocket.Socket.Connections[i].Close в своем оригинале будет выдавать ошибку, поскольку это пример, в котором i - переменная, которая должна содержать фактический номер канала, который нужно узнать по списку пользователей, образом, уже упоминавшимся выше, в частности на использование привата. Разумеется, я не буду всегда приводить конкретный код для пожелавшего его получить, ...только пример и теоретические знания, чтобы научить самостоятельно находить решения.
Теперь, ...если у вас используется система переподключения, которую я описал выше, то ничего подобного на повторное подключение "откинутого" сервером клиента я не наблюдаю. Возможно что-то в коде вы исправили. Процедура Close серверного сокета корректно отключает канал, это не относится с ошибкам сокета, и посему процедура переподключения просто не срабатывает.
Если имеется в виду ручное переподключение посредством клавишь, то у вас должна быть реализована система бана.
Нашел я причину по которой выкинутый клиент из чата снова присоединяется. У ClientSocket с свойстве OnDisconnect тоже стоит таймер на автоподключение.

И в правильном ли я месте поставил активацию тамера при дисконекте?
Код:
procedure TForm1.ClientBtnClick(Sender: TObject);
begin
  If ClientBtn.Tag=0 then
    Begin
ConnectTimer.Enabled:=True; //Активация таймера при дисконекте или ошибке подключения
// клавишу ServerBtn и поля NikEdit, HostEdit, PortEdit заблокируем
      ServerBtn.Enabled:=False;
      NikEdit.Enabled:=False;
      HostEdit.Enabled:=False;
      PortEdit.Enabled:=False;
Shouldercannon вне форума Ответить с цитированием
Старый 02.05.2009, 15:13   #124
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
И в правильном ли я месте поставил активацию тамера при дисконекте?
Место старта таймера коннекта выбрано неверно. Ошибка в том, что сокет еще не готов к работе. Запускать таймер нужно после того, как в клиентский сокет будут переданы данные адреса и порта сервера.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 02.05.2009, 15:58   #125
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Место старта таймера коннекта выбрано неверно. Ошибка в том, что сокет еще не готов к работе. Запускать таймер нужно после того, как в клиентский сокет будут переданы данные адреса и порта сервера.
Код:
procedure TForm1.ClientBtnClick(Sender: TObject);
begin
  If ClientBtn.Tag=0 then
    Begin
// клавишу ServerBtn и поля NikEdit, HostEdit, PortEdit заблокируем
      ServerBtn.Enabled:=False;
// запишем указанный порт в ClientSocket
      ClientSocket.Port:=StrToInt(ChatPort);
// запишем хост и адрес (одно значение HostEdit в оба)
      ClientSocket.Host:=ChatHost;
      ClientSocket.Address:=ChatHost;
ConnectTimer.Enabled:=True; //Активация таймера при дисконекте или ошибке подключения
// запускаем клиента
      ClientSocket.Active:=True;
// изменяем тэг
      ClientBtn.Tag:=1;
// меняем надпись клавиши
      ClientBtn.Caption:='Отключиться';
    end
Хм запутался бред какой-то получается. Получается двойная активация сокета при нажатии на ClientBtn.

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

ClientSocket.Active:=True; нужно удалить, это есть в таймере.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 07.05.2009, 15:14   #127
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Снова про бан систему.
При старте программы в Memo1 помещаю список забаненых IP, потом этот список помещаю в массив.
Код:
var i: integer;
begin
for i:=0 to Memo1.Lines.count-1 do
a[i]:=(Memo1.Lines[i]);
далее получаю IP подключившегося пользователя
Код:
s:=(ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].RemoteAddress);
Далее произвожу сравнение
Код:
var i: integer;
begin
for i:=low(a) to high(a) do
if not (a[i]=s) then
else
ShowMessage('Совпал!'); //Бан
Теперь вопрос, где на сервере отрезать доступ клиенту к чату?

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

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

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

Я хотел спросить в какой процедуре на сервере при совпадении IP не допускать юзера до чата. Вот вы что-то писали
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Можно сделать еще проще. Нужно вставить в таймер цикл перебирающий массив пользователей, и ищущий пометку бана (это запись в типе), как только пометка найдена, нужно пропускать канал.
Код:
procedure TForm1.ServerTimerTimer(Sender: TObject);
begin
// условие на наличие установленных каналов
  If ServerSocket.Socket.ActiveConnections<>0 then
    Begin
// цикл по существующим каналам
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
          // все что ниже идет через проверку на бан
          ...
Определить номер канала в списке можно так:
Код:
UserListView.Selected.Index - 1;
// проверка, чтобы не был выделен сервер

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

Очень просто. Объясню с самого начала. Вот клиент подключился. Процедура в таймере (procedure TForm1.ServerTimerTimer(Sender: TObject); ) работает всегда, даже если не пришло ни одного пакета, ...за наличие пакета отвечает вот этот код:
Код:
text:=ServerSocket.Socket.Connections[i-1].ReceiveText();
// условие, что пакет не пуст
If text<>'' then
  Begin
Так вот, ...перед тем как это условие будет проверять наличие пакета, нужно организовать цикл перебора списка забаненых клиентов, в котором в качестве аргумента числится IP-адрес, это BanMas: array[0..255] of String. Например так:
Код:
For n:=0 to 255 do
  Begin
    If BanMas[n] = ServerSocket.Socket.Connections[i-1].RemoteAddress then
      ServerSocket.Socket.Connections[i-1].Close;
  end;
Не забываем, что для удобства цикл перебора каналов от 1 до ServerSocket.Socket.ActiveConnectio ns, поэтому фактический номер канала i-1. Т.к. цикл проверяет все текущие каналы, то при каждой смене i, заново просмотрится и массив BanMas.
Этот случай просто выкидывает забаненых клиентов.

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

Последний раз редактировалось Beermonza; 08.05.2009 в 15:24.
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