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

Вниз

Как проверить соединение с Интернетом через прокси (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.002 c
2-1309850310
Scott Storch
2011-07-05 11:18
2011.10.23
array of char to string and back


1-1269513869
POP
2010-03-25 13:44
2011.10.23
Какое сообщение Win при восстановлении формы


15-1308941486
xayam
2011-06-24 22:51
2011.10.23
COM-порт: Windows &amp; Embedded Linux


15-1309081495
trololo
2011-06-26 13:44
2011.10.23
Как сделать чтобы при WM_PAINT нарисованное оставалось на форме


4-1251445961
Interesting
2009-08-28 11:52
2011.10.23
Озвучить текст с помощью Microsoft Agent





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский