Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Indy 10, как оборвать коннект?


Автор: DmitryHT 21.11.2007, 04:48
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 и так далее...)

Автор: Snowy 21.11.2007, 10:05
Так ты же сам зачищаешь FContent...
И в твоём коде я не вижу ограничения по кол-ву загруженных байт.
Ну размер буфера поменял. И что это дало?

Автор: DmitryHT 21.11.2007, 13:05
Цитата

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

Код

//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...
 
Даже если не зачишать, то все равно в таком вот случае он не всегда коректно работает.

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

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

Автор: DmitryHT 21.11.2007, 13:40
MetalFan, спасибо!

и доп. спасибо за разъяснения в асе! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)