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

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

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

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

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

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

1,2. В прикрепленном файле везде ползет одна и та же ошибка, отправка у вас идет через:
Код:
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections - 1]
...обращаясь к списку UserListView вы отмечаете любого клиента, а команду посылаете последнему, ActiveConnections - 1 - последний пользователь. Эта модель работает только, если вы работаете с последним пользователем в списке, и тем более с одним единственным. Как только вы попытаетесь с сервера забанить среднего в списке пользователя, команда на блок будет отправлена последнему в списке. Внимательнее! ...перепишите все процедуры. За номер канала отвечает i на сервере, в списке имя через UserListView.Selected, и индекс тоже можно взять:
Код:
ServerSocket.Socket.Connections[i - 1].SendText

...

ServerSocket.Socket.Connections[UserListView.Selected.Index - 1].SendText
...в последнем случае с проверкой, чтобы не выбрать самого себя (сервер).

3. Администрирование у вас проверяется по IP вот из этого массива - AdminIPMas, в момент изъятия привилегий администратора, вы отключаете флаг администратора UserMas[i].Admin := False и удаляете IP с вашего массива AdminIPMas (через цикл). Получается так: пользователь теряет флаг, сразу перестает быть админом, а если выйдет и снова войдет, то условие поиска в AdminIPMas уже не найдет его IP, его там нет, ...работа выполнена, пользователь никогда не будет администратором, до поры, пока вы снова не впишите его IP в массив и не установите флажок UserMas[i].Admin.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.06.2010, 21:13   #432
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Хочу закрепить умение правильно оформлять циклы. Посмотрите пожалуйста файл Оформление цикла.txt, оформление правильное?

1.
Цитата:
Только не забывайте очищать записи при каждом входе и выходе клиентов, иначе все постепенно "станут" админами.
Под очисткой вы имели ввиду это место UserMas[i].Admin := False;

Цитата:
ServerSocket.Socket.Connections[UserListView.Selected.Index - 1].SendText
У меня пока стоит условие, если выбрать самого себя (сервер), то выгоняю из процедуры. Возможно ваш способ проще.

2. В ранее выложенном текстовом документе, вы наверно видели, что IP для бана/разбана, активации/деактивации админки я получаю, обращаясь к каналу i, но у меня IP адреса уже имеются в самом юзер листе, может их брать оттуда или лучше всётаки из канала i?

3.
Цитата:
3. Администрирование у вас проверяется по IP вот из этого массива - AdminIPMas, в момент изъятия привилегий администратора, вы отключаете флаг администратора UserMas[i].Admin := False и удаляете IP с вашего массива AdminIPMas (через цикл). Получается так: пользователь теряет флаг, сразу перестает быть админом, а если выйдет и снова войдет, то условие поиска в AdminIPMas уже не найдет его IP, его там нет, ...работа выполнена, пользователь никогда не будет администратором, до поры, пока вы снова не впишите его IP в массив и не установите флажок UserMas[i].Admin.
С добаление будет наоборот. Включаем флаг UserMas[i].Admin := True;, добавляю IP в AdminIPMas и сразу отправляю команду активации элементов админки, в случае со снятием, то сразу отсылаю команду деактивации элементов админки.

4. Вот тут ещё не понятно.
Код:
len := length(text) - 1;
...
RVChat.AddText(Copy(text, 3, length(text) - 1), 7);
минус 1 символ так понимаю. Если это так, то при такой записи
Код:
RVChat.AddText(Copy(text, 3, length(text)), 7);
никакой разницы не увидел, пока не увидел

5. Частенько помигивающий заголовок сервера - это признак чего? Подозрение на самоддос.

6. Можно сделать, чтобы клиент автоматически отсылал команду проверки на наличие админства?

7. Правильно ли я добавил закрытие канала в случае если IP уже есть в чате?
Код:
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i: Integer;
begin
  // Получим IP подключающегося
  GetConnectIP := Socket.RemoteAddress;

  // Проверка на разрешённый диапазон IP
  d := 0;
  for b := 1 to Range do
    begin
      if (IPtoDWORD(GetConnectIP) >= IPtoDWORD(IPRange[b].IP1)) and (IPtoDWORD(GetConnectIP) <= IPtoDWORD(IPRange[b].IP2)) then
        d := d + 1;
    end;

  // Закрыть канал
  if d = 0 then
    begin
      Socket.SendText('20');
      Socket.Close;
    end;

  // Проверка на имеющийся IP в чате
  // Поиск IP в UserListView
  for i := 0 to UserListView.Items.Count - 1 do
    if Pos(GetConnectIP, UserListView.Items.Item[i].SubItems.Text) <> 0 then
      begin
        Socket.SendText('24');
        Socket.Close;
      end;

  StatusBar1.Panels[2].Text := '[' + TimeToStr(Now) + '] Клиент подключился';

  // Разрешаем обновление
  UpdMas := True;
end;
8. Определение в чей канал отправить приватное сообщение происходит на сервере? Если да, то клиент всеголишь выводит сообщение в чат с условием, что сообщение адресовано ему.
Вложения
Тип файла: txt Оформление цикла.txt (354 байт, 137 просмотров)

Последний раз редактировалось Shouldercannon; 11.06.2010 в 18:34.
Shouldercannon вне форума Ответить с цитированием
Старый 11.06.2010, 23:57   #433
BrewMaster
Новичок
Джуниор
 
Регистрация: 03.06.2010
Сообщений: 2
По умолчанию

Извините что перебиваю Вас. Есть один вопрос у меня.
Я пробовал изменить программу (изначальную) таким образом, чтобы вместо возни с обновлениями списка пользователей, можно было просто передавать объект типа TListItems через метод Sendbuf.
В результате чего, у меня прога выдаёт ошибку. Так вот, возможна ли такая передача вообще?
Можете хотя бы просто ответить, да или нет.

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

BrewMaster, передать объект можно из приложения 1 в приложение 2 на одной машине, ...передача по сети поведет за собой переработку и обновление, поскольку в классе используются указатели на память, которые не сопоставляются на разных машинах сети. Придется передавать массив байт и строить список заново, ...проще его создать с нуля используя последовательность записей, которую передает сервер, экономя ресурсы ПК, трафик и ваше время.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.06.2010, 20:21   #435
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
Хочу закрепить умение правильно оформлять циклы. Посмотрите пожалуйста файл Оформление цикла.txt, оформление правильное?
Не совсем, ...напишу еще раз все варианты, вы сами сравните их наглядность:

Код:
  // пустая строка
  for i := 0 to 10 do Какое-то действие;
  // пустая строка

  ...

  // пустая строка
  for i := 0 to 10 do
    begin
      Какое-то действие 1;
      Какое-то действие 2;
    end;
  // пустая строка

  ...

  // пустая строка
  for i := 0 to 10 do
    begin
      if что-то then
        begin
          Какое-то действие 1;
          Какое-то действие 2;
        end;
    end;
  // пустая строка

  ...

  // пустая строка
  for i := 0 to 10 do
    begin
      if что-то then Какое-то действие;
    end;
  // пустая строка
Цитата:
Сообщение от Shouldercannon
Под очисткой вы имели ввиду это место UserMas[i].Admin := False;
Да, это вписано в процедуру UpdateUserMas. При каждом входе или выходе пользователя, процедура выключает флажки админам и посте приема ответа на запрос идентификации снова устанавливает. Т.е. если разобрать структуру чата (в статье описано), то можно уловить, что в программе "убивается сразу множество зайцев одним выстрелом", ...один из них - не обязательное слежение за состоянием соединения с клиентами, любое их состояние (включение/выключение/сбой соединения) вызывает просто опрос всех присутствующих и новое их регистрирование в системе сервера. Таким образом достигается постоянный контроль пользователей.
Я рекомендую вам не использовать сам список UserListView в качестве опорного для циклов, на это есть внутрисистемный массив UserMas и контрольный "указатель" на число каналов ActiveConnections, иначе вы рискуете "положить" сервер, если процедура списка UpdateUserList неверно заполнит его (человеческий, сетевой фактор).

Цитата:
Сообщение от Shouldercannon
В ранее выложенном текстовом документе, вы наверно видели, что IP для бана/разбана, активации/деактивации админки я получаю, обращаясь к каналу i, но у меня IP адреса уже имеются в самом юзер листе, может их брать оттуда или лучше всётаки из канала i?
Брать IP-адрес "на лету" с вызвавшего событие сокета куда надежнее, чем читать его с какого-то источника, который заполнялся ранее. Единственное что дозволено хранить в списках - это диапазоны фильтров и метки привилегированных пользователей, они же и IP-адреса, ...таковы правила.

Цитата:
Сообщение от Shouldercannon
С добаление будет наоборот. Включаем флаг UserMas[i].Admin := True;, добавляю IP в AdminIPMas и сразу отправляю команду активации элементов админки, в случае со снятием, то сразу отсылаю команду деактивации элементов админки.
Все верно.

Цитата:
Сообщение от Shouldercannon
Вот тут ещё не понятно.

Код:
len := length(text) - 1;
...
RVChat.AddText(Copy(text, 3, length(text) - 1), 7);
минус 1 символ так понимаю. Если это так, то при такой записи

Код:
RVChat.AddText(Copy(text, 3, length(text)), 7);
никакой разницы не увидел, пока не увидел
Пользоваться вырезкой нужно помня, что позиция относительно строки, с которой начинается вырезка, влияет на длину вырезки, которая не является позицией последнего нужного символа, а длиной подстроки:

Код:
Copy(text, 3, length(text) - 1)
...эта запись не верная, вот как она вырежет из строки "12Миша":

МишаЂ ...на конце будет произвольный символ, или операция вызовет ошибку. Между тем, находясь на позиции 3 нужно помнить, что из всей строки ненужных станет 2 предыдущих символа, на это число и станет короче длина правильной вырезки, если хотите вырезать под "самый хвост".

Переменная len уже укорачивает длину пакета на 1, в том первом примере за код отвечал только один символ, ...если у вас теперь 2 символа, значит пусть лен хранит в себе длину пакета минус 2, это будет вещественная часть пакета, его тело, с которым нужно будет работать от начала, с позиции 1.

Цитата:
Сообщение от Shouldercannon
Частенько помигивающий заголовок сервера - это признак чего? Подозрение на самоддос.
Имеется в виду заголовок окна? ...если так, то заголовок автоматически подменяется на содержимое пришедшего пакета, оно нам не нужно, поэтому в коде есть строка восстанавливающая заголовок (Form1.Caption), поскольку интервал таймера у вас выставлен довольно маленький, происходит мерцание.

Цитата:
Сообщение от Shouldercannon
Можно сделать, чтобы клиент автоматически отсылал команду проверки на наличие админства?
Можно. В клиенте сразу после приема строки пользователей в событии ClientSocketRead Case 2: запишите строку отправки запроса на администрирование по определенному коду, ...если сервер найдет пользователя админом, то пришлет пакет активации, иначе просто промолчит.

продолжение следует ...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.06.2010, 20:24   #436
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

... продолжение

Цитата:
Сообщение от Shouldercannon
Правильно ли я добавил закрытие канала в случае если IP уже есть в чате?
Неправильно, ...скорее некорректно:

Код:
Socket.SendText('20');
Socket.Close;
... будет сбой подключения, ошибка сокета. Первая команда выполнится, затем не дожидаясь ответа по протоколу TCP/IP о доставленном пакете без ошибок, канал закроется, ...клиент не получит команду, сервер выведет: "Asynchronous socket error 10061". Решить проблему можно только "впустив" клиента в чат, ...тогда после регистрации, разделения во времени его можно выкинуть, отсылая команду. А так, непосредственно в событии ServerSocketClientConnect, не дожидаясь обновления массива UserMas, можно только закрыть канал ничего не отсылая. У клиента есть событие соответствующие - ClientSocketDisconnect, в нем пропишите автоматически созданное сообщение, обобщающего характера, ...поскольку соединение именно закрыто, то на то есть причины, перечисляйте возможные.

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

Последний раз редактировалось Beermonza; 12.06.2010 в 20:34.
Beermonza вне форума Ответить с цитированием
Старый 12.06.2010, 21:16   #437
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

1.
Цитата:
Сообщение от Shouldercannon
Правильно ли я добавил закрытие канала в случае если IP уже есть в чате?
Неправильно, ...скорее некорректно:
Код:
Socket.SendText('20');
Socket.Close;
... будет сбой подключения, ошибка сокета. Первая команда выполнится, затем не дожидаясь ответа по протоколу TCP/IP о доставленном пакете без ошибок, канал закроется, ...клиент не получит команду, сервер выведет: "Asynchronous socket error 10061". Решить проблему можно только "впустив" клиента в чат, ...тогда после регистрации, разделения во времени его можно выкинуть, отсылая команду. А так, непосредственно в событии ServerSocketClientConnect, не дожидаясь обновления массива UserMas, можно только закрыть канал ничего не отсылая. У клиента есть событие соответствующие - ClientSocketDisconnect, в нем пропишите автоматически созданное сообщение, обобщающего характера, ...поскольку соединение именно закрыто, то на то есть причины, перечисляйте возможные.
По локальной сети ничего не выдавало и исходя из выше вами написанного это тоже должно вызвать ошибку
Код:
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i: Integer;
begin
  // Получим IP подключающегося
  GetConnectIP := Socket.RemoteAddress;

  // Проверка на разрешённый диапазон IP
  d := 0;
  for b := 1 to Range do
    begin
      if (IPtoDWORD(GetConnectIP) >= IPtoDWORD(IPRange[b].IP1)) and (IPtoDWORD(GetConnectIP) <= IPtoDWORD(IPRange[b].IP2)) then
        d := d + 1;
    end;

  // Закрыть канал
  if d = 0 then
    begin
      Socket.SendText('20');
      Socket.Close;
    end;

  StatusBar1.Panels[2].Text := '[' + TimeToStr(Now) + '] Клиент подключился';

  // Разрешаем обновление
  UpdMas := True;
А если просто отсылать команду, приняв её клиент сам закроет соединение ClientSocket.Close;?

2.
Цитата:
Переменная len уже укорачивает длину пакета на 1, в том первом примере за код отвечал только один символ, ...если у вас теперь 2 символа, значит пусть лен хранит в себе длину пакета минус 2, это будет вещественная часть пакета, его тело, с которым нужно будет работать от начала, с позиции 1.
Да, у меня теперь два символа (тип команды: подтип команды). Теперь будет так?
Код:
len := length(text) - 2;
и вот тут for j := 3 to len + 1 do это место не нравится len + 1 do. И скажите пожалуйста что надо сразу поменять, кроме pos и j.

3. Правильно ли написан антибан для сервера (Антибан.txt)?

4.
Цитата:
Что касается сервера, ...у него есть список подключившихся, мышью выбираем клиента (так же как и в привате), в цикле ищем имя в массиве UserMas[j].Name, по совпадению отправляем пакет так же, но по j, почему? ...массив числится от 0 до ActiveConnections-1.
Данный способ можно использовать для бана и разбана? Делать на подобии?
Код:
                     // Создаем цикл перебора пользователей
                      for k := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                        begin
                          // Если пользователь найден
                          if UserMas[k + 1].Name = PrivateUser then
                            begin
                              // Отсылаем сообщение в канал приватного пользователя
                              ServerSocket.Socket.Connections[k].SendText(text);
                              // Сбрасываем цикл
                              break;
                            end;
                        end;
И обезательно надо в лог поместить IP того, с кем работаем.

5. Почему здесь (Code.txt) на помеченой строке возникает ошибка: List index out of bounds (11741895)?

6. Снова трабл с личкой. Хочу всётаки отделить ник от сообщения. Так я отправляю сообщение: '01' + addressee + Chr(152) + Form2.ENick.Text + Chr(161) + ': ' + TextBox.Text, так оно приходит: 01Shouldercannon˜! .'. Server .'. !Ў: Shouldercannon (приват) 0. Проходя через Copy(text, 4 + length(Form2.ENick.Text), len - length(Form2.ENick.Text) - 1 оно становится таким: ! .'. Server .'. !Ў: Shouldercannon (приват) 0. Что-то меня не туда понесло . В общем с пришедшим на клиент приватным сообщением (не обработанного от символов) можно делать что угодно? Поместить пришедший текст начиная с Chr(152) и до конца строки в переменную, далее всё что слева Chr(161) поместить в ник, а то что с права в сообщение. Ход мыслей правельный?
Вложения
Тип файла: txt Антибан.txt (4.9 Кб, 142 просмотров)
Тип файла: txt Code.txt (2.0 Кб, 144 просмотров)

Последний раз редактировалось Shouldercannon; 13.06.2010 в 12:48.
Shouldercannon вне форума Ответить с цитированием
Старый 12.06.2010, 22:40   #438
BrewMaster
Новичок
Джуниор
 
Регистрация: 03.06.2010
Сообщений: 2
По умолчанию

Я плохо знаю Делфи и его структуру, и мне оставалось лишь гадать, сделал ли я всё как надо, или лишь просто такая идея невозможна. Благодарю за ответ!
BrewMaster вне форума Ответить с цитированием
Старый 14.06.2010, 18:00   #439
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
А если просто отсылать команду, приняв её клиент сам закроет соединение ClientSocket.Close;?
Закрытие канала - команда управления, причем одна из основных, на чем держится сервер, пока он монополист на такие команды. Передайте закрытие клиенту и сервер падет через некоторое время, от того, что клиент каким-то образом умудряется оставаться на связи. Нет, нет и нет, ...клиент не должен закрывать канал по команде с сервера, ...сервер должен закрывать канал.
Если у вас хватит терпения, то можете написать счетчик, чтобы пользователь оставался на связи еще некоторое время, которого хватит для корректной отправки команды "20". Но в этом случае пользователя придется впустить в чат, заблокировав ему любые действия.

Цитата:
Сообщение от Shouldercannon
Да, у меня теперь два символа (тип команды: подтип команды). Теперь будет так?
Код:
len := length(text) - 2;
и вот тут for j := 3 to len + 1 do это место не нравится len + 1 do. И скажите пожалуйста что надо сразу поменять, кроме pos и j.
Да, len правильно определяется. Перед циклом по-j есть строчка: text:=text+Chr(152); ...чтобы весь алгоритм разделения был с меньшим числом циклов и счетчиков, пришлось тупо добавить 1 символ в конец, с этого len и "подрос" на 1. В вашем случае изменится позиция 2 на 3, и условие проверки If pos>2 тоже на If pos>3.

Цитата:
Сообщение от Shouldercannon
Правильно ли написан антибан для сервера (Антибан.txt)?
На сколько правильно не знаю, в учителя не нанимался, ....если есть ошибки и проблемы, могу помочь, ...а проверять каждый шаг и править я не должен.

Цитата:
Сообщение от Shouldercannon
Данный способ можно использовать для бана и разбана? Делать на подобии?
Код:
  // Создаем цикл перебора пользователей
  for k := 0 to ServerSocket.Socket.ActiveConnections - 1 do
    begin
      // Если пользователь найден
      if UserMas[k + 1].Name = PrivateUser then
        begin
          // Отсылаем сообщение в канал приватного пользователя
          ServerSocket.Socket.Connections[k].SendText(text);
          // Сбрасываем цикл
          break;
        end;
    end;
И обязательно надо в лог поместить IP того, с кем работаем.
Можно. Лог должен записывать все команды управления, входы и выходы пользователей, и IP-адреса, само собой, это идентификатор конкретного ПК в сети.

Цитата:
Сообщение от Shouldercannon
Почему здесь (Code.txt) на помеченой строке возникает ошибка: List index out of bounds (11741895)?
Процедура имеет собственную переменную i, которая никак не назначается до использования, что она будет содержать неизвестно. Если нужно использовать внешнюю переменную i основного цикла, тогда внутреннюю из var UnbanYes нужно исключить.

Цитата:
Сообщение от Shouldercannon
Снова трабл с личкой. Хочу всётаки отделить ник от сообщения. Так я отправляю сообщение: '01' + addressee + Chr(152) + Form2.ENick.Text + Chr(161) + ': ' + TextBox.Text, так оно приходит: 01Shouldercannon˜! .'. Server .'. !Ў: Shouldercannon (приват) 0. Проходя через Copy(text, 4 + length(Form2.ENick.Text), len - length(Form2.ENick.Text) - 1 оно становится таким: ! .'. Server .'. !Ў: Shouldercannon (приват) 0. Что-то меня не туда понесло . В общем с пришедшим на клиент приватным сообщением (не обработанного от символов) можно делать что угодно? Поместить пришедший текст начиная с Chr(152) и до конца строки в переменную, далее всё что слева Chr(161) поместить в ник, а то что с права в сообщение. Ход мыслей правельный?
Пришедший пакет содержит в себе четкую структуру, нужно внимательно вырезать часть, ...придется учиться.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 14.06.2010 в 18:11.
Beermonza вне форума Ответить с цитированием
Старый 14.06.2010, 21:24   #440
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

1. Закрывая канал юзера я вызываю на клиенте Disconnect и запускаю таймер для переподлючения. Если юзер не допущен до чата и сидит с запущеной прогой, переподключаясь через каждые 5 секунд, он тем самым будет ддосить сервер?
Код:
procedure TForm1.ConnectTimerTimer(Sender: TObject);
begin
  if AccessDenied = False then
    ClientSocket.Active := True;
end;
2. Внутренний интегер i убрал и разбан заработал, но после того как сервер отошлёт личку на клиента бан/разбан и дать/забрать админку рушатся в хлам. Во всех ошибка List index out of bounds (-1) вот здесь
Код:
      // Отошлём команду бана
      ServerSocket.Socket.Connections[i - 1].SendText('20');
      // Получим IP забаненого
      GetBannedIP := ServerSocket.Socket.Connections[i - 1].RemoteAddress;
Полный расклад в Блоки в которых возникает ошибка.txt. Самое интересное, когда заходит новый юзер всё работает до тех пор, пока сервер снова не отошлёт личку.

3.
Цитата:
Сообщение от Shouldercannon
Да, у меня теперь два символа (тип команды: подтип команды). Теперь будет так?
Код:

len := length(text) - 2;

и вот тут for j := 3 to len + 1 do это место не нравится len + 1 do. И скажите пожалуйста что надо сразу поменять, кроме pos и j.

Да, len правильно определяется. Перед циклом по-j есть строчка: text:=text+Chr(152); ...чтобы весь алгоритм разделения был с меньшим числом циклов и счетчиков, пришлось тупо добавить 1 символ в конец, с этого len и "подрос" на 1. В вашем случае изменится позиция 2 на 3, и условие проверки If pos>2 тоже на If pos>3.
Выставил len := length(text) - 2; и на клиенте стал виден только ник сервера. Полный расклад в прикреплённом файле. Но, однако оно работает с тем же самым кодом в таком виде len := length(text) - 1; нормально.

4.
Цитата:
Сообщение от Shouldercannon
Снова трабл с личкой. Хочу всётаки отделить ник от сообщения. Так я отправляю сообщение: '01' + addressee + Chr(152) + Form2.ENick.Text + Chr(161) + ': ' + TextBox.Text, так оно приходит: 01Shouldercannon˜! .'. Server .'. !Ў: Shouldercannon (приват) 0. Проходя через Copy(text, 4 + length(Form2.ENick.Text), len - length(Form2.ENick.Text) - 1 оно становится таким: ! .'. Server .'. !Ў: Shouldercannon (приват) 0. Что-то меня не туда понесло . В общем с пришедшим на клиент приватным сообщением (не обработанного от символов) можно делать что угодно? Поместить пришедший текст начиная с Chr(152) и до конца строки в переменную, далее всё что слева Chr(161) поместить в ник, а то что с права в сообщение. Ход мыслей правельный?

Пришедший пакет содержит в себе четкую структуру, нужно внимательно вырезать часть, ...придется учиться.
Вот как организовал на клиенте
Код:
    // Приватное сообщение
    1: begin
      // Добавим в RVChat приватное сообщение с сервера
      PrvtText := Copy(text, 4 + length(Form2.ENick.Text), len - length(Form2.ENick.Text) - 1);

      // Отделим ник от сообщения
      g := Pos(Chr(161), PrvtText);
      PrvtNick := Copy(PrvtText, 1, g - 1);
      PrvtMessage := Copy(PrvtText, g + 1, length (PrvtText));

      RVChat.AddTextFromNewLine('>> ', 5);
      RVChat.AddText('[' + TimeToStr(Now) + '] ', 2);
      RVChat.AddText(PrvtNick, 8);
      RVChat.AddText(PrvtMessage, 5);
      RVChat.Reformat;
    end;
на сервере
Код:
                      // Добавим в RVChat сообщение клиента
                      PrvtText := Copy(text, 4 + length(PrivateUser), len - length(PrivateUser) - 1);

                      // Отделим ник от сообщения
                      g := Pos(Chr(161), PrvtText);
                      PrvtNick := Copy(PrvtText, 1, g - 1);
                      PrvtMessage := Copy(PrvtText, g + 1, length (PrvtText));

                      RVChat.AddTextFromNewLine('>> ', 5);
                      RVChat.AddText('[' + TimeToStr(Now) + '] ', 2);
                      RVChat.AddText(PrvtNick, 8);
                      RVChat.AddText(PrvtMessage, 5);
                      RVChat.Reformat;
Работает нормально.
Вложения
Тип файла: txt Code.txt (18.3 Кб, 143 просмотров)
Тип файла: txt Блоки в которых возникает ошибка.txt (6.1 Кб, 148 просмотров)

Последний раз редактировалось Shouldercannon; 15.06.2010 в 11:46.
Shouldercannon вне форума Ответить с цитированием
Ответ


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