Форум: "Начинающим";
Текущий архив: 2011.10.23;
Скачать: [xml.tar.bz2];
ВнизКак проверить соединение с Интернетом через прокси (wininet) Найти похожие ветки
← →
StuDD (2011-07-02 20:58) [0]Пробовал с Indy, но мне подсказали, что лучший вариант - wininet. Информации на данную тему пролистал не мало, но в основном одно дублирует другое, а по существу ничего и нет...
Понятно только, что нужно использовать функцию InternetOpen:
http://nmdsoft.blogspot.com/2010/06/internetopen.htmlvar
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