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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Indy 10, как оборвать коннект? 
:(
    Опции темы
DmitryHT
Дата 21.11.2007, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



IdHttp.CreateIOHandler;
Код

if (FMax_size < 32768)
then IdHttp..IOHandler.RecvBufferSize:= Fmax_size
else IdHttp..IOHandler.RecvBufferSize:= 32768;
Try
  FContent:= IdHttp.Get(FURL);
Except
  FContent:= '';
End;


задача - разорвать соединение при получении N байт.
При такой вот конструкции в 10-й версии Indy в Try Except шенерируется исключение: EidConnClosedGracefully, а переменной FContent ничего не присваивается

что делать?
есть какие варианты??

п.с. onWork в 10-ке работает как-то не корректно smile  или с динамическими сайтами AWorkCount так и должен себя вести? (то 4091, то опять 1000, то 2000 и так далее...)
PM MAIL   Вверх
Snowy
Дата 21.11.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Так ты же сам зачищаешь FContent...
И в твоём коде я не вижу ограничения по кол-ву загруженных байт.
Ну размер буфера поменял. И что это дало?
PM MAIL   Вверх
DmitryHT
Дата 21.11.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

И в твоём коде я не вижу ограничения по кол-ву загруженных байт.
Ну размер буфера поменял. И что это дало?

Код

//1
procedure TThread.onWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  if (Fmax_size <> 0) and (AWorkMode = wmRead) and (AWorkCount >= Fmax_size[quote]
  then  IdHttp.IOHandler.Close;
end;


но данная констукция не всегда работает корректно, толи с днамическими сайтами у нее проблемы, толи еще с чем:
для многих страниц значение AWorkCount при размере буфера в 1000 байт выдает след. значения при каждом вызове onwork - 400, 1400, 2400, 3400, 4091,  а следующее снова 400. (числа взяты для примера, но они точно отражают работу функции).
Поэтому пробовал также такой вариант onWork: 

Код

//2
procedure TThread.onWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
begin
  if (FMax_size <> 0) and (AWorkMode = wmRead) then
  Begin
    if AWorkCount > FPrev_Count
    then FDownloaded_size:= FDownloaded_size - FPrev_Count;
    FDownloaded_size:= FDownloaded_size + AWorkCount;
    FPrev_Count:= AWorkCount
  End;
  if (FDownloaded_size >= FMax_size)
  then FGetIt.IOHandler.Close;
end;

тут ее отличие в том, что даже если AWorkCount "сбросится", то переменная FDownloaded_size все равно получит верное число считанных байт. 

Цитата

Так ты же сам зачищаешь FContent...
 
Даже если не зачишать, то все равно в таком вот случае он не всегда коректно работает.

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


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


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

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



чтото не найду примера... я приводил, как более менее корректно оборвать соединение.
делать примерно так:
Код

var
  lStrStream: TStringStream;
begin
  lStrStream := TStringStream.Create;
try
   idHTTP.Get( AURL, lStrStream );
except
end;
...
procedure OnHTTPWork...
begin
  if Condition then
     idHTTP.IOHandler.Close;
end;


таким образом часть данных всетаки попадут в lStrStream

Это сообщение отредактировал(а) MetalFan - 21.11.2007, 13:25


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


Шустрый
*


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

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



MetalFan, спасибо!

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

Запрещено:

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

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

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

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

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


 




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


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

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