Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как БЫСТРО проверить доступность http:\\IP-адреса в И-нете? [D7]


Black Krok ©   (2006-02-03 11:47:00) 

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

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

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

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


isasa   (2006-02-03 16:31:00) [1]

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


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


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

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

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)


DVM   (2006-02-03 16:11:00) [3]


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

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


Black Krok   (2006-02-03 15:58:00) [4]

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


Black Krok   (2006-02-03 15:56:00) [5]

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


DVM   (2006-02-03 15:44:00) [6]


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

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

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


isasa   (2006-02-03 15:36:00) [7]

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

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

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


Black Krok   (2006-02-03 15:26:00) [8]

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


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

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


isasa   (2006-02-03 14:31:00) [10]

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

С прокси
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);


DVM   (2006-02-03 14:20:00) [11]


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

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


Black Krok   (2006-02-03 13:55:00) [12]

" Да, поспешил. Здесь надо обрабатывать код возврата запроса, на предмет =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.


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

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

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

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


isasa   (2006-02-03 13:38:00) [14]

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


isasa   (2006-02-03 13:35:00) [15]

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


DVM   (2006-02-03 12:55:00) [16]


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

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


Gero   (2006-02-03 11:57:00) [17]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо