| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Странный таймаут TidHTTP |
| Автор: AXS 12.10.2009, 13:21 | ||||
| Давненько не писал на программерские форумы, да вот занесла опять нелёгкая в прикладное... В общем суть такова: опрашиваю диапазон IP-адресов посредством idHTTP (Indy 10)
ReadTimeout и ConnectTimeout выставляю 2000 Но почему то ответа (преимущественно от несуществующих IP) приходится ждать гораздо дольше чем 2 секунды... Пробовал выставлять
но тогда перебор пролетает со скоростью звука и безо всяких ответов... Кто просвятит по таймаутам тому респект и уважуха |
| Автор: MetalFan 12.10.2009, 16:30 |
| ни версии делфи, ни версии индей(10.?.?)... телепатов тут нет. извините. если версия "та, что с делфей", то советую обновиться с оффсайта indyproject.org |
| Автор: AXS 13.10.2009, 06:38 | ||
"Та что с делфи" 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 несколько раз выполняется
Подвисает на втором выполнении. Я проследовал дальше и разведал такую фишку
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 | ||
Так как это не надо бороться? Как то нехорошо получается.... Может есть альтернативные компоненты? А метод научного тыка (в этом случае) заключается в поочерёдной простановке бряков в OllyDebugger'e |
| Автор: MetalFan 21.10.2009, 09:22 |
| НЕверным путем идете, товарищ!) альтернативные. да навалом. WinInet, WinHTTP (это не компоненты!), любимый многими ICS. есть еще парочка, которые я в глаза не видел, но тут(на форуме) упоминали вроде. |
| Автор: AXS 22.10.2009, 11:34 | ||
Да что ж вы всё загадками говорите... Если я иду неверным путём то какой верный?.. Нужели у всех при переборе ip-адресов (включая несуществующие) idhttp тупит?... |