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

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

Как проверить соединение с Интернетом через прокси (wininet)


StuDD ©   (2011-07-02 20:58:00) 

Пробовал с Indy, но мне подсказали, что лучший вариант - wininet. Информации на данную тему пролистал не мало, но в основном одно дублирует другое, а по существу ничего и нет...
Понятно только, что нужно использовать функцию InternetOpen:
http://nmdsoft.blogspot.com/2010/06/internetopen.html
var
 hSession: HInternet;
begin
hSession := InternetOpen('Mozilla/5.0', INTERNET_OPEN_TYPE_PROXY, 'xxx.xxx.xxx.xxx:xxx', nil,0);
//..................
InternetCloseHandle(hSession);
end;

А как в случае необходимости прописать логин и пароль для доступа прокси? И как в итоге получить true/false на вопрос о наличии подключения?


sniknik   (2011-07-03 21:46:00) [1]

> TId TCPClient ... T HttpClient
а почему мотоцикл не машина, а мотоцикл? или почему электромобиль на бензине не ездит?
это сложные философские вопросы недоступные моему пониманию, поэтому ответить не смогу... мне бы что попроще, топорнее и именно в том виде что есть, без сленга коверкавший и т.д.

> google не существует?
русских букв не понимает?

> А как это сделать?
решай проблемы по одной, по мере поступления, не лезь "вперед батьки" до выяснения в чем именно проблема - вот залог успеха.

http://www.linuxrsp.ru/artic/top-50-programming-quotes-of-all-time-russian.html
29


StuDD   (2011-07-03 20:58:00) [2]

>> > просто истекает таймаут.
>> т.е. "стучишься" на не существующий адрес


ну как-же "не существующий"? - я же из адресной строки копирую!
И почему TIdTCPClient.Host := 'google.com' достаточно, а для THttpClientни хттп://ввв.google.ru, ни хттп://ввв.google.com, ни хттп://ввв.google.ru/webhp?hl=ru&tab=ww ... - никак google не существует?

>> с пере направлением (не обрабатываешь)
А как это сделать?


sniknik   (2011-07-03 17:43:00) [3]

> просто истекает таймаут.
т.е. "стучишься" на не существующий адрес, с пере направлением (не обрабатываешь), и т.д.
гугль то тут при чем?

> то-же замечание на счёт google.
ламерье`с.


StuDD   (2011-07-03 17:16:00) [4]

> sniknik
Реально? - если выход в Интернет есть, просто истекает таймаут. Со всеми прочими сайтами, конечно в формате " http://msdn.microsoft.com", установка соединения происходит успешно и буквально тут-же. На форумах заметил то-же замечание на счёт google.


sniknik   (2011-07-03 16:45:00) [5]

> Если в Except прописать ShowMessage('отказываюсь подключаться!') так и скажет )))
за такую "пропись" увольняют... реально то что говорит?


StuDD   (2011-07-03 13:14:00) [6]

> Прокси относится к WinHTTP, а не WinInet
WinINet FunctionsInternetOpen
http://msdn.microsoft.com/en-us/library/aa385096(VS.85).aspx


Anatoly Podgoretsky   (2011-07-03 12:55:00) [7]

http://social.msdn.microsoft.com/Search/en-us?query=wininet+%2B+proxy


Anatoly Podgoretsky   (2011-07-03 12:54:00) [8]

> StuDD  (03.07.2011 12:35:09)  [9]

Прокси относится к WinHTTP, а не WinInet


StuDD   (2011-07-03 12:52:00) [9]

> sniknik ©   (03.07.11 11:34) [7]
>> да ну? прям так и говорит "отказываюсь подключаться!"?

Если в Except прописать ShowMessage('отказываюсь подключаться!') так и скажет ))) Напишешь ссылку на любой другой сайт - исключения не произойдёт.

> Anatoly Podgoretsky,
Так я на основе статей и собрал вышеприведённый код! если в нём есть ошибки, так подскажите поконкретнее! - мол, например, "... неправильно используешь InternetOpenURL ... почитай про 3,4 параметры...".


Anatoly Podgoretsky   (2011-07-03 12:43:00) [10]

> StuDD  (03.07.2011 12:35:09)  [9]

http://msdn.microsoft.com/en-us/library/aa385331(v=VS.85).aspx


StuDD   (2011-07-03 12:35:00) [11]

> Anatoly Podgoretsky ©   (03.07.11 11:43) [8]
>> Все версии wininet гарантировано рабочии.


Тогда проверьте, пожалуйста, меня:
var
 hSession: HInternet;
begin
 hSession := InternetOpen('Mozilla/5.0', INTERNET_OPEN_TYPE_PROXY, 'login:password@XXX.XXX.XXX.XXX:port', nil,0);
 // hSession := InternetOpen('Mozilla/5.0', INTERNET_OPEN_TYPE_PROXY, 'XXX.XXX.XXX.XXX:port', nil,0);
 if hSession = nil
 then begin
   MessageDlg('Error, InternetOpen: Соединение не может быть установлено', mtError, [mbOK], 0);
   exit;
 end;
 URL := InternetOpenURL(hSession, PChar(' http://www.sql.ru'), nil, 0, 0, 0);
 if URL = nil
 then begin
   MessageDlg('Error, InternetOpenURL: Ссылка не может быть открыта!', mtError, [mbOK], 0);
   InternetCloseHandle(hSession);
   exit;
 end;
 //..................
 InternetCloseHandle(hSession);
end;

Будет ли это работать? Обязательно ли указывать тип прокси? (если да, то где в коде)


Anatoly Podgoretsky   (2011-07-03 11:43:00) [12]

> StuDD  (03.07.2011 07:07:06)  [6]

Все версии wininet гарантировано рабочии.


sniknik   (2011-07-03 11:34:00) [13]

> И IdHTTP компромитирует себя отказом подключаться к сайту google
да ну? прям так и говорит "отказываюсь подключаться!"?


StuDD   (2011-07-03 07:07:00) [14]

> забивать надо в настройки IE

А если сисадмин против это делать? - Не должно быть Интернета на этом компьютере! Так вот настройки вбить для одной программы - это да. А из IE это и всё подряд на компьютере может настройки забрать! ))

Пытался использовать IdHTTP из Indy:
IdHTTP.Head(' http://www.ru/t.t');
if IdHTTP.ResponseCode=200 //связь есть

Только у него два разных способа забить настройки прокси - ProxyParams и через пригромаждение  ... -IdIOHandlerSocket - IdSocksInfo. И вот в отсутствии прокси на своём компьютере только теоретически могу пока прописывать настройки в коде (((
И IdHTTP компромитирует себя отказом подключаться к сайту google (к другому - пожалуйста). Вот, в связи со всем вышеизложенным, и пытаюсь найти гарантированно рабочий код wininet.


Gu   (2011-07-02 21:53:00) [15]

Это самый надежный вариант, я тоже много чего перепробовал.
проверяем:
- есть ли сеть вообще
- включена ли
- есть ли ответ от апишной функции о наличии инета
- проверяем конкретный адрес (можете свой вставить вместо 8.8.8.8)

>> и если забить в программы

забивать надо в настройки IE, только на основе этого винда решение принимает (можно через реестр нужные вставлять, чтобы пользователя не тревожить)


StuDD   (2011-07-02 21:44:00) [16]

Gu, а вот это уже интересно ))) спасибо!
Хотя меня вот что смущает - на компьютере Интернета нет, т.е. настройки прокси нигде не прописаны. Но компьютер в сети с проксёй и если забить в программы, где есть соответствующие параметры - адрес, порт, логин и пасс, то конкретно эта программа доступ и Интернет иметь будет.
Так что, не смотря на более сложный пример, GuIsInetConnectA:Bool без этих 4-х параметров скорее всего вернёт false ?


Gu   (2011-07-02 21:27:00) [17]

вариант 2

Function GuNetIsOnline:Bool;
const INTERNET_CONNECTION_OFFLINE = $20;
type TInternetGetConnectedStateFunc = function (lpdwFlags: LPDWORD;dwReserved: DWORD): BOOL; stdcall;
var ConnectFlag: DWORD;LibraryHandle: THandle;InternetGetConnectedStateFunc: TInternetGetConnectedStateFunc;
begin result:=false;
   Try
   LibraryHandle:=SafeLoadLibrary('wininet.dll');
   InternetGetConnectedStateFunc:=GetProcAddress(LibraryHandle,'InternetGetConnecte dState');
   Result:=Assigned(InternetGetConnectedStateFunc) and InternetGetConnectedStateFunc(@ConnectFlag, 0) and (ConnectFlag <> INTERNET_CONNECTION_OFFLINE);
   FreeLibrary(LibraryHandle);
   Except
   // none
   End;
end;

Function GuisNetworked:bool;
begin
Result:=GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;

Function GuIsInetConnectA:Bool;
const INTERNET_CONNECTION_MODEM=1;INTERNET_CONNECTION_LAN=2;INTERNET_CONNECTION_PROXY= 4;
var connectiontype:DWORD;
begin connectiontype:=INTERNET_CONNECTION_MODEM or INTERNET_CONNECTION_LAN or INTERNET_CONNECTION_PROXY;result:=false;
if GuisNetworked then if GuNetIsOnline then if InternetGetConnectedState(@connectiontype,0) then Result:=InternetCheckConnection('8.8.8.8',$00000001,0);
end;

// 8.8.8.8 публичный dns google


StuDD   (2011-07-02 21:24:00) [18]

Нет, так будет слишком много ложных срабатываний! Доступа в глобальную сеть нет, а результат положительный... Да в общем-то эту сверхрастиражированную функцию уже неоднократно ругали...
Так что - не то (((


Gu   (2011-07-02 21:12:00) [19]

{S} Function InternetGetConnectedState(lpdwFlags: LPDWORD; dwReserved:DWORD):BOOL; Stdcall;External 'wininet.dll' Name 'InternetGetConnectedState';

Function GuIsInetConnect:Bool;
const INTERNET_CONNECTION_MODEM=1;INTERNET_CONNECTION_LAN=2;INTERNET_CONNECTION_PROXY= 4;
var connectiontype:DWORD;
begin connectiontype:=INTERNET_CONNECTION_MODEM or INTERNET_CONNECTION_LAN or INTERNET_CONNECTION_PROXY;result:=false;
if InternetGetConnectedState(@connectiontype,0) then Result:=true;
end;


Наверх

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