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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задержка при выполнении InternetOpenURL 
:(
    Опции темы
urix
  Дата 26.12.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если, например интернета нет, или нет запрашиваемого файла, то программа надолго (30 секунд) задумывается при выполнении

hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,Flags,0);

Как БЕЗ ДЛИТЕЛЬНОЙ ЗАДЕРЖКИ проверить, есть ли доступ к нужному файлу?

--------------------------------
InternetGetConnectedState с параметром INTERNET_CONNECTION_OFFLINE не помогает, если например интернет через VPN, и отключен. То же самое и InternetQueryOption с параметром INTERNET_OPTION_CONNECTED_STATE.
--------------------------------
InternetCheckConnection(pchar(fileURL),FLAG_ICC_FORCE_CONNECTION,0) тоже задумывается на 30 секунд.
--------------------------------
InternetCheckConnection(pchar(fileURL),0,0) вообще всегда возвращает false.
--------------------------------
пробовал так:
InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT...
InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT...
InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT...
но тоже не помогает.
PM MAIL   Вверх
Snowy
Дата 26.12.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(urix @ 26.12.2005, 14:22)
InternetCheckConnection(pchar(fileURL),0,0) вообще всегда возвращает false.

1. Перенести файл на другой хостинг - который отвечает на пинги.
2. Использовать другие способы доступа (Indy, WinSocks, etc.)
3. Запустить InternetOpenURL в отдельном потоке, который сообщит основному по мере появления результатов, не мешая работе программы.
PM MAIL   Вверх
urix
Дата 26.12.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Snowy
1. Пинги хостов работают нормально. Адреса с которых качаются файлы я не могу выбирать. То есть если файл есть - он качается без проблем, а если нет, то прога задумывается.
2. посмотрю
3. Файлов иногда приходится качать много, один за другим, так что вариант с отдельным потоком для проверки не подходит.

И ещё, проблема наверное разделяется на две:
1. Сеть есть, а интернета нет
2. Интернет есть, но нужного файла по заданному url нет.

Кстати, в описании InternetCheckConnection написано что пингуется именно хост. То есть наличие конкретного файла так не узнать.
Вероятно, надо сделать какой-то TIMEOUT меньше - но какой?
PM MAIL   Вверх
Snowy
Дата 26.12.2005, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(urix @ 26.12.2005, 17:02)
И ещё, проблема наверное разделяется на две:
1. Сеть есть, а интернета нет
2. Интернет есть, но нужного файла по заданному url нет.

Нет, легко решается простым приемом - просто проверяем наличие урла, который гарантировано существует. (типа гугль).

Цитата(urix @ 26.12.2005, 17:02)
Файлов иногда приходится качать много, один за другим, так что вариант с отдельным потоком для проверки не подходит.

Просто выстраиваешь список из урлов на закачку. Можешь качать в несколько потоков или в один. Закачал - берем следующий по списку.

Цитата(urix @ 26.12.2005, 17:02)
если нет, то прога задумывается.

Ну да, ну да. Пинг тут не поможет.
Видимо винда несколько раз подряд пинговать пытается для надежности.
Честно говоря, не знаю, как это можно победить...
На Indy этот вопрос решается легко, но там встает проблема с настройками прокси.
Их нужно у пользователя спрашивать.
Добавлено @ 17:12
Цитата(urix @ 26.12.2005, 17:02)
То есть если файл есть - он качается без проблем, а если нет, то прога задумывается.

По идее, задумываться должно при отсутствии коннекта, а не файла.
При отсутствии файла должно бодренько рапортовать 404.
PM MAIL   Вверх
RA
Дата 26.12.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



Цитата(urix @ 26.12.2005, 14:22)
пробовал так:
InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT...
InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT...
InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT...
но тоже не помогает.


А чё отступился? В правильном направлении копал ....
Если покажешь что получилось в этом направлени может совмесными усилиями отыщем ошибку.

PM   Вверх
urix
Дата 26.12.2005, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Перед выполнением InternetOpenURL,
запрашиваю значения

InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT...
InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT...
InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT...

и ставлю новые, например в 30 раз меньше. В конце возвращаю всё на место. Разницы я не заметил.

Первоначальные значения возвращались такие:
INTERNET_OPTION_CONNECT_TIMEOUT=300000
INTERNET_OPTION_RECEIVE_TIMEOUT=не помню точно сколько нулей, но больше (360000...)
Добавлено @ 18:26
Snowy
Во многих случаях, действительно как и полагается возвращается 404, но есть исключения - в них то и проблема.
PM MAIL   Вверх
RA
Дата 26.12.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



Я когда-то писал подобное, заного писать не буду, но если код покажешь (весь код, чтоб я смог сам протестировать), то скорее всего помогу.
PM   Вверх
urix
Дата 26.12.2005, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



RAdmin
Условия: Delphi7, локальная сеть активна, интернет выключен.

Код

uses wininet;
const  FLAG_ICC_FORCE_CONNECTION = 1;
var  WinInetEx_Max_TIMEOUT : cardinal = 10000;
......................
//думает 30 секунд, если интернет отключён
//если без FLAG_ICC_FORCE_CONNECTION, то всегда false
if internetCheckConnection(pchar('http://www.google.com'),FLAG_ICC_FORCE_CONNECTION,0) then
  Caption:='OK'
else
  Caption:='Error';
......................
Function GetFileSize(const sAppName, FileURL:string; NoCache:boolean):cardinal;
var
  hSession, hURL: HInternet;
  Flags:cardinal;
  N,BufferLen:cardinal;
  boo:boolean;
begin
  Result:=0;
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if hSession<>nil then begin
    try
      if NoCache then Flags:=INTERNET_FLAG_RELOAD else Flags:=0;

       //если файла нет, то чтоб прога не зависала надолго
       BufferLen:=sizeof(N);
       boo:=InternetQueryOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,@N,BufferLen); //N выходит 300000
       boo:=InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,@WinInetEx_Max_TIMEOUT,BufferLen);
      hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,Flags,0);  //думает 30 секунд, если интернет отключён
       boo:=InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,@N,BufferLen);

      //запрашиваю полный размер файла
      if hURL<>nil then result:=GetFileSize_(hURL);

    finally
      InternetCloseHandle(hSession);
    end;
  end; //hSession
end;
.......................
procedure TForm1.Button1Click(Sender: TObject);
begin
  caption:=inttostr(GetFileSize(ExtractFileName(Application.ExeName),'http://www.google.com',true));
end;

Добавлено @ 22:45
всё это в WinXP SP2
PM MAIL   Вверх
RA
Дата 27.12.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



urix Дейсвительно в заданных условиях wininet глючит. smile
думаю в данном случаи больше подойдёт winhttp.dll
PM   Вверх
urix
Дата 27.12.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



RAdmin
а для него должен быть где-то хедерный файл?

Это сообщение отредактировал(а) urix - 27.12.2005, 17:53
PM MAIL   Вверх
RA
Дата 28.12.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



Вот набор компонентов, в том числе и Http клиенты на основе wininet и winhttp, с исходниками и примерами, думаю это будет более полезно. smile
Найдёшь все что нужно для работы с winhttp.

http://torry.net/vcl/internet/http/Alcinoe30619.zip


PS: MSDN должен содержать описание всех функций winhttp.
winhttp можно совместно использовать с wininet, но что касается работы с протоколом http то winhttp надежнее.

Работать с winhttp также как и с wininet, всё почти одинаково.



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

Запрещено:

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

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

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

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

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


 




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


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

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