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


Автор: AXS 12.10.2009, 13:21
Давненько не писал на программерские форумы, да вот занесла опять нелёгкая в прикладное...
В общем суть такова: опрашиваю диапазон IP-адресов посредством idHTTP (Indy 10)
Код

      urla:=urly[i];
      try
        Memo1.Lines.Add('--------------------------------');
        rqst:=idHttp1.Get(urla);
        Memo1.Lines.Add(urla);
        Memo1.Lines.Add(rqst);
        Memo1.Lines.Add('--------------------------------');
      except
        Memo1.Lines.Add(urla);
        Memo1.Lines.Add(idHttp1.ResponseText);
        Memo1.Lines.Add('--------------------------------');
      end;

ReadTimeout и ConnectTimeout выставляю 2000
Но почему то ответа (преимущественно от несуществующих IP) приходится ждать гораздо дольше чем 2 секунды...
Пробовал выставлять
Код

idHTTP1.Socket.ConnectTimeout:=2000;
idHTTP1.Socket.ReadTimeout:=2000;

но тогда перебор пролетает со скоростью звука и безо всяких ответов...
Кто просвятит по таймаутам тому респект и уважуха  smile 

Автор: MetalFan 12.10.2009, 16:30
ни версии делфи, ни версии индей(10.?.?)... телепатов тут нет. извините.
если версия "та, что с делфей", то советую обновиться с оффсайта indyproject.org

Автор: AXS 13.10.2009, 06:38
Цитата(MetalFan @ 12.10.2009,  16:30)
ни версии делфи, ни версии индей(10.?.?)... телепатов тут нет. извините.
если версия "та, что с делфей", то советую обновиться с оффсайта indyproject.org

"Та что с делфи" 9, а я написал 10...
______________________________________________

Подробнее:
Indy 10.0.52 (с офф сайта)
Delphi 7.0 (Build 4.453)
Windows XP Professional (Build 2600: Service Pack 2)


Автор: MetalFan 13.10.2009, 11:02
AXS, с 2009 идет 10ка, с 2010 10ка под юникод. про версию делфи в первом посте ни слова.
а теперь по делу: лучше с оффсайта взять http://indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx. 10.0.52, если мне память не изменяет, не очень стабильная.
так же в 10ке вроде св-ва Read и Connection таймауты вынесены в TIdHTTP. зачем через сокет устанавливать...
может стоит каким-нибудь профайлером посмотреть (или на худой конец отладчиком), на что инди тратят столько времени?
кстати, ConnectionTimeout, если я не ошибаюсь, в индях реализовано через доп.поток...

Автор: AXS 13.10.2009, 13:39
Короче поотлаживал я idHTTP - точного результата не узнал в силу того что идёт подсчёт времени и если трассировать код indy то получаешь ошибочку отсутствия подключения к инету (я так полагаю)
Но примерно определил: после вызова Get в idHTTP.pas несколько раз выполняется
Код

function TIdCustomHTTP.GetResponseHeaders: TIdHTTPResponse;
begin
  Result := FHTTPProto.Response;
end;

Подвисает на втором выполнении. Я проследовал дальше и разведал такую фишку
Код

      while ATimeout > LSleepTime do begin
        IdGlobal.Sleep(LSleepTime);
        ATimeout := ATimeout - LSleepTime;

        if LInfinite then begin
          ATimeout := LSleepTime + 1;
        end;

LInfinite в моём процессе всегда false. LSleepTime = 125. ATimeout на старте 2000.
Весь цикл нормально прогоняется пока ATimeout не обнулися. Тогда процесс "засыпает" на 5-10 секунд.
Отлаживать дальше не получается - ловлю исключение "Network is unreachable"

Автор: AXS 14.10.2009, 12:21
Методом научного тыка вычислил что тормоза создаёт WaitFor; при закрытии сокета.
Как с этим побороться, кто скажет?
PS: WaitFor описан в Classes.pas

Автор: MetalFan 15.10.2009, 21:59
AXS, не надо с ним бороться...

Добавлено через 21 секунду
расскажи лучше о методе научного тыка)

Автор: AXS 21.10.2009, 08:58
Цитата(MetalFan @ 15.10.2009,  21:59)
AXS, не надо с ним бороться...

Добавлено @ 21:59
расскажи лучше о методе научного тыка)

Так как это не надо бороться? Как то нехорошо получается.... Может есть альтернативные компоненты?


А метод научного тыка (в этом  случае) заключается в поочерёдной простановке бряков в OllyDebugger'e

Автор: MetalFan 21.10.2009, 09:22
НЕверным путем идете, товарищ!)
альтернативные. да навалом. WinInet, WinHTTP (это не компоненты!), любимый многими ICS. есть еще парочка, которые я в глаза не видел, но тут(на форуме) упоминали вроде.

Автор: AXS 22.10.2009, 11:34
Цитата(MetalFan @ 21.10.2009,  09:22)
НЕверным путем идете, товарищ!)
альтернативные. да навалом. WinInet, WinHTTP (это не компоненты!), любимый многими ICS. есть еще парочка, которые я в глаза не видел, но тут(на форуме) упоминали вроде.

Да что ж вы всё загадками говорите... Если я иду неверным путём то какой верный?.. 
Нужели у всех при переборе ip-адресов (включая несуществующие) idhttp тупит?...

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