Проверить работоспособность URL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Проверить работоспособность URL

Сообщение Особист » 09.10.2009 (Пт) 22:33

Подскажите пожалуйста какой-нибудь (желательно наиболее быстрый) способ проверить доступность файла по ссылке.
Например задаём "http://mysite.com/index2.htm" или "http://mysite.com/", процедура сообщает, есть ли такой файл или нет. При этом процедура файл по ссылке не закачивается (иначе получается слишком медленно, потому и спрашиваю совета).
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Проверить работоспособность URL

Сообщение awl100Alex » 09.10.2009 (Пт) 22:56

Код: Выделить всё
Private Const FLAG_ICC_FORCE_CONNECTION = &H1
Private Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwFlags As Long, ByVal dwReserved As Long) As Long

Private Sub Form_Load()
    If InternetCheckConnection("http://www.allapi.net/", FLAG_ICC_FORCE_CONNECTION, 0&) = 0 Then
        MsgBox "Connection to http://www.allapi.net/ failed!", vbInformation
    Else
        MsgBox "Connection to http://www.allapi.net/ succeeded!", vbInformation
    End If
End Sub

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Проверить работоспособность URL

Сообщение Особист » 10.10.2009 (Сб) 1:46

Спасибо за быстрый ответ!
Правда, решение не работает (((
Попробуйте например это: http://kedrograd.ru/gallery/556/001.html
Такого файла НЕТ, но при этом сообщается, что succeed. Видимо, потому что сам сервер kedrograd.ru существует.
Нужно именно чтобы однозначно говорилось, есть конкретный файл или 404. Пока решаю через "качалку", но при этом приходится грузить весь файл целиком, что очень долго... :(
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Проверить работоспособность URL

Сообщение iGrok » 10.10.2009 (Сб) 1:50

Делать HEAD-запрос через WinHTTPRequest.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверить работоспособность URL

Сообщение Хакер » 10.10.2009 (Сб) 3:25

Правильный ответ: никак.
Можно проверить наличие ресурса, на который указывает URL. Ресурс и файл --- слишком разные понятия.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Проверить работоспособность URL

Сообщение Особист » 10.10.2009 (Сб) 12:14

Привет!
Указанный способ работает, причём с приемлемой скоростью.
Но, к сожалению, когда идёт цикл опроса, пропускает некоторые неработоспособные ссылки.
Причём при повторном опросе эти ссылки обнаруживаются. Т.е. надо прогонять цикл раза три, чтобы отсеить все сбойные.
Код:
Код: Выделить всё
Function checkURL(strURL)
On Error GoTo 99
Dim objHTTP
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.SetTimeouts 0, 3000, 2000, 5000
objHTTP.Open "HEAD", strURL, False
objHTTP.Send
checkURL = objHTTP.Status
Exit Function
99 checkURL = ""
End Function

Private Sub command1_Click()
If checkURL("www.kedrograd.ru/gallery/001.jpg") = "200" Then
  MsgBox "ok"
Else
  MsgBox "error!"
End If
End Sub


Это для примера. В программе идёт цикл For...Next, который обрабатывает массив линков URLArray() as string.
Уверен что косяк или в ошибке кода, или в том, что сервер "захлёбывается" от запросов.
В чём беда?

P.S.: И да, Хакер прав, я неправильно выразился - конечно же ресурс.
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: Проверить работоспособность URL

Сообщение Gogic » 10.10.2009 (Сб) 15:00

В чём беда?


Поэкспериментируй с таймаутами и задержками внутри самого цикла (DoEvents).

Решение где-то рядом. :)

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Проверить работоспособность URL

Сообщение Особист » 11.10.2009 (Вс) 1:09

DoEvents - первое, что пришло в голову. Делал, ноль эмоций.
Есть ещё задержки типа Delay (могу ошибаться) или некий цикл, считающий доли секунд, или скажем таймер, но тогда метод лишён смысла, т.к. вряд ли будет значительно быстрее чем мой первоначальный способ.

P.S.: Думаю в сторону организации асинхронного обращения одновременно к нескольким URL. Наверное нужно делать юзерконтрол с этой функцией, грузить несколько штук на форму и в каждый отправлять очередной URL, после чего обрабатывать поступающие результаты. Насколько такой способ может быть оправдан? Что-то коробит так поступать, честно говоря - засорение памяти получается...
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: Проверить работоспособность URL

Сообщение Gogic » 12.10.2009 (Пн) 21:17

DoEvents - первое, что пришло в голову. Делал, ноль эмоций.
Есть ещё задержки типа Delay (могу ошибаться) или некий цикл, считающий доли секунд, или скажем таймер, но тогда метод лишён смысла, т.к. вряд ли будет значительно быстрее чем мой первоначальный способ.


Да, я это и имел в виду, не DoEvents в чистом виде.

Примерно так:

pTime=(поэкспериментируй с этим значением, в секундах, например 0.1)

Код: Выделить всё
sTime = GetTickCount
        Do While GetTickCount < sTime + pTime
        Doevents
        Loop


Вставлять, я думаю, понятно куда, между строчками:
Код: Выделить всё
objHTTP.Send
checkURL = objHTTP.Status


Также, побаловаться с этими цифрами:
Код: Выделить всё
objHTTP.SetTimeouts 0, 3000, 2000, 5000



P.S.: Думаю в сторону организации асинхронного обращения одновременно к нескольким URL.


Думай в сторону многопоточности.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 6

    TopList