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

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

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

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

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

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

Нужно в массив делать запись, что клиент уже забанен, и проверять эту запись, только если она False, и бан именно на этого клиента шлется пакет, т.е. один раз, дальше идет фактический игнор клиента, это должно быть отмечено и в цикле перебора каналов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 30.06.2009, 09:25   #242
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Теперь будем думать, какие у вас есть предложения? ...у меня они есть, но хочется научить логически мыслить именно вас, тех кому эта тема интересна.
Так почему же в моем коде отсылается 2-я, 3-я строка пользователей некоторым клиентам (пост 236) ?
Думал как поправить и вижу только оно решение:
незарегистрироавваного пользователя переподключать чтоб он становился в конец списка... но хотелось бы разобрать почему не работает мой код... подскажите...
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 30.06.2009, 15:09   #243
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ради интереса и поиска правды, сделайте интервал ServerTimer 1000 мс, в исходном коде будет видно как сервер опрашивает клиентов, и когда отправляется список. Если это происходит слишком быстро, то возникает коллизия пакетов принимаемых и отправляемых. Попробуйте разделить во времени процедуры UpdateUserMas и UpdateUserList.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 01.07.2009, 16:05   #244
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Ради интереса и поиска правды, сделайте интервал ServerTimer 1000 мс, в исходном коде будет видно как сервер опрашивает клиентов, и когда отправляется список. Если это происходит слишком быстро, то возникает коллизия пакетов принимаемых и отправляемых. Попробуйте разделить во времени процедуры UpdateUserMas и UpdateUserList.
1. Интервал помог частично, при накапливании подключений наблюдается тот же эфект (пробовал с одной машины с 30 подключениями) вывод - увеличивать интервал сервера, но это не выход
2. Разделение процедур UpdateUserMas и UpdateUserList - никакого эфекта...

Выход нашел следующим способом:
1. На машине клиента создаю файл в котором находится информация пользователя и флаг регистрации.
2. Запускаю клиент.
3. Если регистрация пройдена (флаг) активирую ClentSocket, отсылаю запрос на соединение с именем и паролем, сервер идентифицирует и в зависимости от даных цепляет либо отключает клиента для последующей регистрации (пункт 4).
4. Если активация не пройдена активирую ClentSocket, отсылаю данные на регистрацию, если данные удовлетворяют требованиям сервер цепляет клиента, если нет - отключает соединение и переход опять на пунк 4.

Хотелось бы услишать критику по даному способу и где в алгоритме есть тонкие места...
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 02.07.2009 в 12:01.
spirit-ua вне форума Ответить с цитированием
Старый 02.07.2009, 23:44   #245
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от spirit-ua Посмотреть сообщение
2. Разделение процедур UpdateUserMas и UpdateUserList - никакого эфекта...
Разделить во времени процедуры UpdateUserMas и UpdateUserList нужно, просто пустить UpdateUserList только тогда, когда все клиенты ответят на запросы процедуры UpdateUserMas, а это значит что все клиенты Rec = True, тогда коллизии исключаются, в исходном варианте допускается только последовательное подключение клиентов. Понимаете, если клиентов 5, подключились в какой-то момент 3, и ответили, то сервер считает, что их всего 3, срабатывает UpdateUserList, и в этот же момент когда уходят пакеты со списком остальные двое подключаются и отвечают, снова срабатывает UpdateUserList, идет "перекрестный огонь", ...в этой суматохе сервер путается со списками. Я знаю вариант исправления, но пока руки не доходят, терпение, скоро напишу код.
Цитата:
Сообщение от spirit-ua Посмотреть сообщение
Выход нашел следующим способом:
1. На машине клиента создаю файл в котором находится информация пользователя и флаг регистрации.
2. Запускаю клиент.
3. Если регистрация пройдена (флаг) активирую ClentSocket, отсылаю запрос на соединение с именем и паролем, сервер идентифицирует и в зависимости от даных цепляет либо отключает клиента для последующей регистрации (пункт 4).
4. Если активация не пройдена активирую ClentSocket, отсылаю данные на регистрацию, если данные удовлетворяют требованиям сервер цепляет клиента, если нет - отключает соединение и переход опять на пунк 4.

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

Последний раз редактировалось Beermonza; 02.07.2009 в 23:49.
Beermonza вне форума Ответить с цитированием
Старый 03.07.2009, 19:09   #246
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Счастье Разделение во времени обновления массива и списка пользователей

Значит вот. В конце таймера ServerTimer идет такая структура:
Код:
// разрешение выполнения процедуры обновления массива
  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;
Эта структура не дает обрабатывать список пока не определится сколько всего пользователей, а когда определится, то список обновляется не трогая массив, и только после того, как счетчик сосчитал все авторизации, кроме того, внутренний подсчет на ContList в UpdateUserList остается, ...можно его использовать для регистрации. Далее, смотрим обработку авторизации на канал:
Код:
// код приема ника клиента -----------------------------------------------------
                1: Begin
// запишем в массив полученный ник
                     UserMas[i].Name:=Copy(text,2,len);
// отметим, что пользователь записан в список
                     UserMas[i].Rec:=True;
// отметим авторизацию счетчиком
                     Inc(Autores);
                   end;
// -----------------------------------------------------------------------------
Процедура обновления массива немного видоизменяется:
Код:
procedure TForm1.UpdateUserMas;
begin
  If ServerSocket.Socket.ActiveConnections > 0 then
    Begin
// очищаем массив
      For i:=1 to 255 do
        Begin
          UserMas[i].Status := 0;
        end;

// заполняем данные пользователей
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
          UserMas[i].Status := 2;
          UserMas[i].Name := 'Неизвестный';
          UserMas[i].Image := 0;
// запрашиваем имя (ник) пользователя по его каналу (код команды - 1)
          ServerSocket.Socket.Connections[i-1].SendText('1');
        end;
    end;
// сброс авторизации
  Autores := 0;
end;
...ну и обновление списка тоже:
Код:
procedure TForm1.UpdateUserList;
begin
// очищаем список клиентов
  UserListView.Items.Clear;
// очищаем переменную
  StrUserList:='';
// обнуляем пометку записи
  ContList:=0;

// пробегаем по диапазону каналов
  For i:=0 to ServerSocket.Socket.ActiveConnections do
    Begin
// если запись не пустая
      If UserMas[i].Status > 0 then
        Begin
// добавим в UserListView строку
          UItems := UserListView.Items.Add;
          UItems.Caption := UserMas[i].Name;
          UItems.ImageIndex := UserMas[i].Image;
// если пользователь не записан
          If UserMas[i].Rec = False then ContList:=1;
// составляем строку пользователей
          StrUserList:=StrUserList+UserMas[i].Name+Chr(152);
        end;
    end;

// если все пользователи отметились, и есть хоть один канал
    If (ContList=0) And (ServerSocket.Socket.ActiveConnections > 0) then
      Begin
// пробегаем по всем открытым каналам
        For i:=0 to ServerSocket.Socket.ActiveConnections-1 do
          Begin
// отправим строку списка пользователей (код команды - 2)
            ServerSocket.Socket.Connections[i].SendText('2'+StrUserList);
          end;
      end;
end;
Вызовы на обновление идут теперь только у массива:
Код:
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
...
// разрешаем обновление
  UpdMas:=True;
end;

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
...
// разрешаем обновление
  UpdMas:=True;
end;
Пробуйте, ...я поставил в ожидание 10 клиентов и потом создал сервер, все определились без ошибок и лист у всех одинаковый и приват работает. Остается вам только добавить свои нюансы, ...у кого с регистрацией.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.07.2009, 16:32   #247
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию Шифрование

Вопрос:
зачем вообще шифровать передачу данных?

Обмен данными идет только между клиентом и сервером так что другой клиен не в состоянии перехватить чужое сообщение, так???
Я так понимаю что шифровать данные необходимотоль чтоб клиен не подставил "левый" запрос и получил какие то данные
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 08.07.2009, 16:54   #248
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Отправить в канал нельзя, но прослушивающие порты программы существуют, ...данные шифруются для того, чтобы никто раньше времени не понял метод общения клиента и сервера на уровне протокола. Сейчас все на ладони.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.07.2009, 13:40   #249
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Отправить в канал нельзя, но прослушивающие порты программы существуют, ...данные шифруются для того, чтобы никто раньше времени не понял метод общения клиента и сервера на уровне протокола. Сейчас все на ладони.
Ну и пусть слушает СВОЙ канал, остальные каналысервера ему недоступны, а то что он узнает методику общения клиента и сервера что ему даст???
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 14.07.2009, 15:58   #250
rzawm
Пользователь
 
Аватар для rzawm
 
Регистрация: 06.04.2009
Сообщений: 80
По умолчанию

Уважаемые, а как на сервере сделать так чтобы каждый из клинентов не мог слать сообщения чаще чем к примеру раз в 3 секунды. Понятно что надо использовать таймер, сделать какойто счётчик, но как? К примеру на форме разместить каойнибудь эдит для ввода интервала, и по нажатию на создать сервер, как бы применялся. Т.е. не давал никакому юзеру слать сообщения к примеру чаще чем через 3 секунды. Этим мы слегка сможем защитить сервер от падения, как сказать DDOS атак
rzawm вне форума Ответить с цитированием
Ответ


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