Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.23;
Скачать: CL | DM;

Вниз

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

 
StuDD   (2011-07-02 20:58) [0]

Пробовал с 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 на вопрос о наличии подключения?


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

{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;


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

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


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

вариант 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:44) [4]

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


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

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

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

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


 
StuDD   (2011-07-03 07:07) [6]

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

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

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

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


 
sniknik ©   (2011-07-03 11:34) [7]

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


 
Anatoly Podgoretsky ©   (2011-07-03 11:43) [8]

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

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


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

> 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 12:43) [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:52) [11]

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

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2011-07-03 12:55) [13]

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


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

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


 
sniknik ©   (2011-07-03 16:45) [15]

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


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

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


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

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

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


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

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


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

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


 
sniknik ©   (2011-07-03 21:46) [19]

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

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

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

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



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

Текущий архив: 2011.10.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.008 c
2-1309625895
StuDD
2011-07-02 20:58
2011.10.23
Как проверить соединение с Интернетом через прокси (wininet)


6-1244462643
Zheksonz
2009-06-08 16:04
2011.10.23
проверка на наличие компьютера в сети


15-1309206592
Юрий
2011-06-28 00:29
2011.10.23
С днем рождения ! 28 июня 2011 вторник


15-1309267786
eXAAAXe
2011-06-28 17:29
2011.10.23
Что за функция OpenRaw?


1-1269772989
dmitry1208197320
2010-03-28 14:43
2011.10.23
Как организовать работу с картами типа google?