Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

Как БЫСТРО проверить доступность http: IP-адреса в И-нете?   Найти похожие ветки 

 
Black Krok ©   (2006-02-03 11:47) [0]

Уважаемые мастера.
Существует масса ссылок, как проверить доступность:
Тут и InternetCheckConnection()
и VCL-компоненты типа TIdHTTP
и пара InternetOpen(), InternetOpenUrl()
и пара InternetOpen(), InternetConnect()....

Однако последняя всегда возвращает !=nil значение, даже если в параметре, "несущем" название адреса(lpszServerName) указать какую-нить ахинею. :)

Все остальные подходы больны одной проблемой. Если соединение возможно, ответ приходит немедленно. Если невозможно - они раздумывают секунд 15-20. Так же себя ведет и утилита Telnet. Видимо, желая себя перепроверить, они пытаются достучаться несколько раз.

А вот утилита Ping проверяет то же самое мнгновенно.
Как можно сравниться с Ping? Что использует она?


 
Gero ©   (2006-02-03 11:57) [1]

Она использует, как это не странно, ping-запросы.


 
DVM ©   (2006-02-03 12:55) [2]


> А вот утилита Ping проверяет то же самое мнгновенно.

не мгновенно если узел не доступен


 
isasa ©   (2006-02-03 13:35) [3]

ping (ICMP) и  http:\\IP-адреса в И-нете - разные вещи.
Узел может пинговаться, но веб-сервера на нем может и не быть.
Самое быстрое - посылка http запроса, любым способом, но не GET, а HEAD методом.


 
isasa ©   (2006-02-03 13:38) [4]

Однако последняя всегда возвращает !=nil значение
Да, поспешил. Здесь надо обрабатывать код возврата запроса, на предмет =200(Ok), 404(not found) ...


 
Black Krok ©   (2006-02-03 13:51) [5]

"ping (ICMP) и  http:\\IP-адреса в И-нете - разные вещи."

ОК, спасибо. Но в данном случае, положим, я знаю, что сервер есть.
Проблема в том, что имеется некий ActiveX компонент, взаимодействующий с сервером. Но если связь обрывается, этот компонент никак на это не реагирует. События не вызываются. Ничего похожего на статус у него нет. Просто замирает картинка и все. Я хотел сам отслеживать факт доступности по таймеру, но получается, что узнаю я об этом только через 20 сек. после начала проверки.

"Самое быстрое - посылка http запроса, любым способом, но не GET, а HEAD методом."
А как?


 
Black Krok ©   (2006-02-03 13:55) [6]

"Да, поспешил. Здесь надо обрабатывать код возврата запроса, на предмет =200(Ok), 404(not found)"
Серьезно? Я сейчас проверю.... однако в MSDN:
Returns a valid handle to the FTP, Gopher, or HTTP session if the connection is successful, or NULL otherwise.


 
DVM ©   (2006-02-03 14:20) [7]


> Проблема в том, что имеется некий ActiveX компонент, взаимодействующий
> с сервером. Но если связь обрывается, этот компонент никак
> на это не реагирует. События не вызываются. Ничего похожего
> на статус у него нет. Просто замирает картинка и все.

Этот компонент случайно не с IP камерой работает?


 
isasa ©   (2006-02-03 14:31) [8]

Вот приблизительная схемка, рабочего файла не нашел, сорри. "Освежил" систему дома на компах и заодно на работе. Потерял все ссылки :)

С прокси
hSes:=InternetOpen(PChar(Application.ExeName), INTERNET_OPEN_TYPE_PROXY, PChar(buf), nil, INTERNET_FLAG_RELOAD);
или без
hSes:=InternetOpen(PChar(Application.ExeName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, INTERNET_FLAG_DONT_CACHE);
....
С логоном
hURL:=InternetConnect(hSes, PChar(sServ), 0, Pchar(URL.login), PChar(URL.pass), INTERNET_SERVICE_HTTP, 0, 0)
или без
hURL:=InternetConnect(hSes, PChar(sServ), 0, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
if hURL=nil then begin
   InternetCloseHandle(hSes);
   exit;
end;
....
                              ------- здесь или указательна строку с "HEAD" (второй параметр ф-ции)
                             |
hHTTP:=HttpOpenRequest(hURL, nil, PChar(URLPath), nil, nil, nil,
     INTERNET_FLAG_NO_AUTO_REDIRECT or INTERNET_FLAG_PRAGMA_NOCACHE or
     INTERNET_FLAG_RELOAD,
     0);
if hHTTP=nil then begin
   InternetCloseHandle(hURL);
   InternetCloseHandle(hSes);
   exit;
end;
.....
вот здесь уйдет запрос
HttpSendRequest(hHTTP, nil, 0, nil, 0);

HttpQueryInfo(hHTTP, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, @i, bLen, hInd);
а здесь уже имеем результат в i
URL.Result:=i;
заголовки
HttpQueryInfo(hHTTP, HTTP_QUERY_RAW_HEADERS_CRLF, rBuff, bLen, hInd);
если был HEAD, то, по идее дальше не надо
....
 if InternetQueryDataAvailable(hHTTP, BytesAvail, 0, 0) then
...
  InternetReadFile(hHTTP, rBuff, cURL.bufLen, BytesRead);

InternetCloseHandle(hHTTP);
InternetCloseHandle(hURL);
InternetCloseHandle(hSes);


 
Black Krok ©   (2006-02-03 15:19) [9]

Этот компонент случайно не с IP камерой работает?
С ней, родимой....


 
Black Krok ©   (2006-02-03 15:26) [10]

2 isasa

     SetLength(Buf,10);
     HttpSendRequest(hHTTP, nil, 0, nil, 0);
     i := Length(Buf);
     Reserv := 0;
     Buf[1] := "A";
     HttpQueryInfo(hHTTP, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, @Buf[1], i, Reserv);

     HttpQueryInfo(hHTTP, HTTP_QUERY_RAW_HEADERS_CRLF, @Buf[1], i, Reserv);

В конце, независимо от доступности адреса
Buf=#$D#$A#0#0#0#$10#0#0#0#0
i=2


 
isasa ©   (2006-02-03 15:36) [11]

Не, лучше так ...

var
  i : longword;
....
 bLen:=4;
 HttpQueryInfo(hHTTP, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, @i, bLen, hInd);

и будет как целое, внимательно посмотри MSDN. :)


 
DVM ©   (2006-02-03 15:44) [12]


> С ней, родимой....

а что за камера если не секрет?

p.s. Имею некоторый опыт работы с IP-камерами без использования ActiveX


 
Black Krok ©   (2006-02-03 15:56) [13]

BOOL HttpQueryInfo(
 HINTERNET hRequest,
 DWORD dwInfoLevel,
 LPVOID lpvBuffer,
 LPDWORD lpdwBufferLength,
 LPDWORD lpdwIndex
);
Казалось очевидным, что lpvBuffer - последовательность байт. Онако рез-т тот же....
Значение i не зависит от того, доступна камера или нет


 
Black Krok ©   (2006-02-03 15:58) [14]

2 DVM
Это не совсем камера. Это черный ящик под названием Internet Video Server "Planet", к которому что только не подключают....


 
DVM ©   (2006-02-03 16:11) [15]


> Это не совсем камера. Это черный ящик под названием Internet
> Video Server "Planet", к которому что только не подключают.
> ...

Знаю, знаю, IVS-100 он называется. Выдает видео в формате MJPEG. С получением звука не разобрался. Видео выдает скрипт /GetData.cgi.
Очень производительная штуковина. И крайне глюкавый ActiveX.


 
isasa ©   (2006-02-03 16:25) [16]

Или я чего-то не понимаю, но при правильной реализации должно быть

10 Описания кодов состояния (Status Code Definitions).
...
10.2.1 200 OK. (в переменной $00C8)

Запрос был удачно выполнен. Информация, возвращаемая с ответом зависит от метода, используемого в запросе. Например:
GET
в ответе представлен объект, соответствующий запрошенному ресурсу;
HEAD
в ответе представлены поля заголовка объекта (entity-header), соответствующие запрошенному ресурсу. Тело сообщения (message-body) отсутствует;
POST
в ответе представлено описание объекта или содержится результат действия;
TRACE
в ответе представлен объект, содержащий сообщение запроса, полученого конечным сервером.
...

если адрес бред, то

10.4 4xx - Коды ошибок клиента.

Класс кодов состояния 4xx предназначен для случаев, когда клиент, возможно, допустил ошибку. За исключением ответа на запрос HEAD, серверу СЛЕДУЕТ включить объект, содержащий объяснение ошибочной ситуации, и объяснение, является ли она временной или постоянной. Эти коды состояния применимы к любому методу запроса. Агентам пользователя СЛЕДУЕТ показывать пользователю любой включенный объект.

Обратите внимание: Если клиент посылает данные, то реализации сервера, использующей TCP, следует гарантировать, что клиент подтвердил получение пакета(ов), содержащего ответ, прежде чем сервер закроет соединение. Если клиент продолжает посылать данные серверу после закрытия соединения, TCP стек сервера пошлет пакет сброса (RST) клиенту, а TCP стек клиента, в свою очередь, может стереть клиентские неподтвержденные входные буфера прежде, чем они будут прочитаны и интерпретированы приложением HTTP.
10.4.1 400 Испорченный Запрос, Bad Request. (в переменной $0190)


 
isasa ©   (2006-02-03 16:31) [17]

В конце-концов, посмотри, что приходит в заголовках, только буфер можно побольше


i:=2048;
HttpQueryInfo(hHTTP, HTTP_QUERY_RAW_HEADERS_CRLF, @Buf[1], i, Reserv);
Memo1.Lines.Add(Buf);




Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.035 c
6-1138449644
newprogrammer
2006-01-28 15:00
2006.06.04
ftp клиент своими руками


2-1148119883
Glex
2006-05-20 14:11
2006.06.04
Как получить имена всех подпапок, находящихся в данной папке?


15-1146945640
GanibalLector
2006-05-07 00:00
2006.06.04
Кто помнит pascal...


2-1147777741
Steplerr
2006-05-16 15:09
2006.06.04
Печать файла в DOS кодировке


2-1147682133
Hitkliff
2006-05-15 12:35
2006.06.04
Опять WebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский