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

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

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

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

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

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

Это чего за экзотика ?

Код:
if not ServerSocket.Socket.ReceiveLength <= 2022 then
...не проще ли обойтись одним сравнением ?

Код:
if ServerSocket.Socket.ReceiveLength > 2022 then
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.08.2010, 21:22   #562
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Было на данный участок кода подозрение, но не придал особого значения этому.
У меня возникли вопросы по данной системе проверки на подленность:
1. Сможет ли пользователь набрать все три нарушения, если в каждом из них мы отправляем в L1 и перед обработкой команд делаем предварительный сброс d := 0. Максимум, по моему мнению, можно набрать только два или вообще одно. Может просто переводить в L1 без принятия каких-либо мер
2. В самом конце таймера после восстановления Caption формы я после подсчёта нарушений закрываю соединение с нарушителем, как в этом случае поступить с обновлением списка юзеров

Последний раз редактировалось Shouldercannon; 20.08.2010 в 13:10.
Shouldercannon вне форума Ответить с цитированием
Старый 21.08.2010, 12:14   #563
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

2. Как можно реализовать третью иконку - иконку админа? Первым действие скорее всего нужно добавить какой-нибудь разделитель или символ здесь
Код:
                    // Обработка админов
                    for c := 0 to 255 do
                      begin
                        if AdminIPMas[c] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                          UserMas[i].Admin := True;
                      end;
Shouldercannon вне форума Ответить с цитированием
Старый 21.08.2010, 17:23   #564
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Сброс d := 0 должен быть только в конце условия в основном таймере:

Код:
If text<>'' then
  Begin

    ...

    // вот тут
  end;
Когда основные операции с каналом закончены, прежде чем цикл по-i перейдет к следующему каналу в таймере, ...нужно организовать счет тактов, и условие: как только счетчик насчитал, например, 10, то выполнить для пользователя подсчет нарушений и в соответствии с их количеством необходимые действия, и следом сброс d := 0. Для чего это нужно? ...если будет просто сбой сети, в одном цикле при такой проверке, как организовано у вас, определить умышленное нарушение невозможно. Если следить за пользователем в течении нескольких тактов, и считая нарушения в каждом из них, можно уже составить "картину преступления" и принять меры.

Закрытие с сервера канала пользователя вызовет ServerSocketClientDisconnect, обновление списка и опрос на авторизацию выполнится автоматически.

С иконками статусов и пр. я вроде уже пояснял как быть. Вот создание строки списка:

StrUserList := StrUserList + UserMas[i].Name + Chr(152);

Четко зная, что первые несколько байт - системные, можно легко вносить в список и все коды на иконки и состояния:

StrUserList := StrUserList + UserMas[i].Rank + UserMas[i].StatIcon + UserMas[i].Name + Chr(152);

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

1, Не буду делать подсчёт нарушений так как закрывать соединение бесполезно это только вызовет на клиенте автопереподключение и лишнее обновление списка юзеров. Банить нарушителя тоже бесполезно. С клиента не так часто могут приходить неверные пакеты, это больше относится к программам, в которых на нужный IP:Port начинает посылаться всякий мусор на сервер.

2. Пояснение иконки статуса читал. Сейчас попробую разобраться.
UserMas[i].Rank это будет string и равен 1 // Админ.
Код:
                  // Обработка админов
                  for c := 0 to 255 do
                    begin
                      if AdminIPMas[c] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                        begin
                          UserMas[i].Admin := True;
                          UserMas[i].Rank := '1'; // Установка ранка для отсылки на клиент
                        end;
                    end;
Возникла проблема с установкой иконки админа сервере, ведь на нём иконка задаётся так
Код:
UItems.ImageIndex := UserMas[i].Image;
На клиенте не до конца понял опредление иконки и поэтому не могу разобраться
Код:
              // Укажем соответствующую иконку пользователя
              if pos2 > 3 then
                UItems.ImageIndex := 1
              else
                UItems.ImageIndex := 0;
Может всех пропустить через Rank? Сервер = 0, Юзер = 1, Админ = 2. На клиенте давать иконку по числу стоящим перед ником
Код:
// Укажем соответствующую иконку пользователя
if переменная содержащая цифру перед ником = 0 then
UItems.ImageIndex := 0;
if переменная содержащая цифру перед ником = 1 then
UItems.ImageIndex := 1;
if переменная содержащая цифру перед ником = 2 then
UItems.ImageIndex := 2;

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

Если пользователь нарушил достаточно, его нужно выбросить и записать в банлист, его повторное подключение будет игнорироваться.

Rank - ранг: сервер, пользователь, администратор, нужны иконки в ImageList, они должны именоваться соответственно. В любой момент можно у клиента по пришедшему списку и символам до ника определить номер картинки, через StrToInt, будет число его присвоить к UItems.ImageIndex.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.08.2010, 13:03   #567
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Разобраться с иконками оказалось проще чем я думал.

Цитата:
Сообщение от Beermonza Посмотреть сообщение
У массива UserMas[i] есть запись Status, ее значение 0 - запись пустая, не использующаяся; 1 - запись занята, там записан подключившийся клиент. Задайте еще одно значение: 2 - офлайн пользователь. Кроме того нужно создать файл, где записаны все когда-либо подключавшиеся пользователи, и при его чтении нужно записывать в массив UserMas[i] данные пользователя с файла, в UserMas[i].Status записывать 2.
В процедуре UpdateUserList добавить условие, если UserMas[i].Status = 2, то добавлять в список пользователя всегда, не удалять его при обновлении и опросе. Цвет изменить нельзя, но можно поставить другую иконку.
Оффлайновые сообщения нужно хранить так же в массиве и в файле. Добавьте запись в тип TUserList примерно такую:
Код:
Type
  ...
  OffMsg: array[0..9] of String;     // 10 сообщений
 end;
Разумеется, нужно переписать серверные условия на приватный прием. Принцип: если пользователь найден, и Status <> 2, то отсылаем приватное сообщение ему, ...следом идет условие: если пользователь найден, и Status = 2, то открываем цикл, в нем счетчик считает сообщения, типа Inc(t), и сохраняет текст сообщения в UserMas[i].OffMsg[t], и условие на переполнение счетчика: если t > 9, то t = 0; Вот в принципе и все.
Хм.
Клиент
Код:
procedure TFormMain.UpdateUserMas;
begin
  // Очищаем массив
  for i := 1 to 255 do
    begin
      UserMas[i].Status := 0;
    end;

  // Заполняем данные пользователей
  begin
    UserMas[i].Status := 2;
    UserMas[i].Name := 'Неизвестный';
    UserMas[i].Image := 1;
  end;
end;
Сервер
Код:
procedure TFormMain.MMServerOnOffClick(Sender: TObject);
begin
...
      // Вписываем параметры сервера
      UserMas[0].Status := 1;
      UserMas[0].Rec := True;
      UserMas[0].Name := FormSettings.ENick.Text;
      UserMas[0].Rank := '0';
      UserMas[0].Image := 5;

      // Разрешаем обновление
      UpdMas := True;
...
      // Стираем параметры сервера
      UserMas[0].Status := 0;
      UserMas[0].Rec := False;
      UserMas[0].Name := 'Неизвестный';
      UserMas[0].Rank := '0';
      UserMas[0].Image := 5;
...
Статусы с 0 по 2 заняты и поэтому для offline юзера нужен статус 3 или я что-то не так понял.

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

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

Цитата:
Сообщение от Beermonza Посмотреть сообщение
А зачем отмечать в списке off-line пользователей? ...нет в списке и все, значит нет на связи, подключится - появится в списке.
Я не знаю, вы предложили данный способ и если я правильно понял, то юзер, которого нет в сети будет иметь другую иконку (если оно того требует) и не будет сбрасываться при обновлении списка, но если это не нужно, то не буду делать.
Shouldercannon вне форума Ответить с цитированием
Старый 23.08.2010, 20:03   #570
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Юзер, которого нет в сети не может иметь иконку, он не подключен к серверу, его нет в списке пользователей, ...андерстенд?
Руководитель проекта 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