Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Range Check Error 
:(
    Опции темы
Sokolll
Дата 27.7.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Использую Indy10.1.5  TIdTCPServer и TIdTCPClient, SSL  (0.96m).
Подсоединяюсь к серверу клиентом, все работает нормально. Останвливаю сервер, запускаю снова на том же порту, подсоединяюсь -
и на клиенте и на сервере вылетает ERangeError:   Range Check Error   (причем вылетает не каждый раз) - в модуле IdIOHanlder.pas в процедуре TIdIOHandler.ReadBytes в после строки ReadFromSource:
Код

    // Read from stack until we have enough data
    while FInputBuffer.Size < AByteCount do begin
      ReadFromSource(False);
      CheckForDisconnect(True, True);
    end;


На сервере читаю строки:
Код

procedure TSpServer.IdTCPServerExecute(AContext: TIdContext);
var
  S: string;
begin
  ...
   S:=AContext.Connection.IOHanlder.ReadString(8);
  ...

На клиенте(в потоке)  аналогично:
Код

procedure TSpClientReadingThread.Run;
var
  S: string
begin
  if not FConnected then
    Exit;
  IdTCPClient.IOHandler.ReadString(8);
  ...


Если делать то же самое без SSL - все нормально работает.
Искал в И-нете - нашел (http://newsgroups.cryer.info/borland/public.delphi.internet.winsock/200504/0504131867.html) , что это вроде бы как баг версии Indy 10.0.52 и в следующих версиях он исправлен.

Помогите, плиз!


PM MAIL   Вверх
MetalFan
Дата 28.7.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



скачай последнюю 10.1.6 версию, может там эта проблема решена


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 29.7.2007, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Цитата

скачай последнюю 10.1.6 версию, может там эта проблема решена

скачал - то же самое :(
PM MAIL   Вверх
MetalFan
Дата 29.7.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



найди ту строку, на которой действительно возникает исключение. выход за пределы массива...
а те куски, что приведены, ни о чем не говорят


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 29.7.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Цитата

найди ту строку, на которой действительно возникает исключение. выход за пределы массива...
а те куски, что приведены, ни о чем не говорят


IDE  показывает, что ошибка происходит в IdIOHandler.pas вот здесь (строка CheckForDisconnect):
Код

procedure TIdIOHandler.ReadBytes(
  var VBuffer: TIdBytes;
  AByteCount: Integer;
  AAppend: Boolean = True);
begin
  Assert(FInputBuffer<>nil);

  if AByteCount > 0 then begin
    // Read from stack until we have enough data
    while FInputBuffer.Size < AByteCount do begin
      ReadFromSource(False);
      CheckForDisconnect(True, True);
    end;
    FInputBuffer.ExtractToBytes(VBuffer, AByteCount, AAppend);
  end else if AByteCount = -1 then begin
    ReadFromSource(False, ReadTimeout, False);
    CheckForDisconnect(True, True);
    FInputBuffer.ExtractToBytes(VBuffer, -1, AAppend);
  end;
end;


Разобрался я вроде:
Сначала на клиенте сделал обработку ошибок:
Код

procedure TSpClientReadingThread.Run;
var
  S: string;
begin
  if not FConnected then
    Exit;
  try
    S:=IdTCPClient.IOHandler.ReadString(8);
  except;
    Stop;
  end;

Ошибка все равно вылетала. Потом дошло: выполниться ли код в потоке или нет у меня зависит от FConnected, значение которого меняется на False только в обработчике IdTCPClient.OnDisconnected:
Код

procedure TSpClientReadingThread.IdTCPClientDisconnected(Sender: TObject);
begin
  FConnected:=False;
end;

Получается, что OnDisconnected не срабатывает. Добавил строчку FConnected:=False в Run и стало работать нормально:
Код

procedure TSpClientReadingThread.Run;
var
  S: string;
begin
  if not FConnected then
    Exit;
  try
    S:=IdTCPClient.IOHandler.ReadString(8);
  except;
    FConnected:=False;
    Stop;
  end;

Работает, но не могу понять, почему не работало до этого - ведь поток то останавливаю, да и почему RangeCheckError. Без SSl все ОК.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.