Доброго времени суток!!!
Появилась необходимость проверять подключение к интернету. Ну сделал как бабушка писала: поискал по сайту, по яндексу и т.д. Нашел процеДУРУ InternetCheckConnection.
Если первый параметр установить в nil, то подключен ли ты к инету или нет все равно будет писать что нет, а если указать сервер то нормально работает. А что делать если сервер не доступен? Не решил ли кто эту проблему?
Заранее спасибо.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
09-11-2005 05:24
Забудьте про понятие "подключён к интернету", оно не имеет отношения к реальности. А InternetCheckConnection, в любом случае, не будет работать через прокси.
Определитесь, зачем вам нужно "проверять подключение к интернету", если просто пользователю сообщать, то тогда он и должен задавать способ проверки (ему виднее как он подключен), если требуется наличие некоего сервиса (протокола, сервера, файла, итд), то его и надо проверять (пинговать, пытаться скачать итд).
Цитирую кусок статьи Лозовюка Александра "Использование Interenet-функций Win32® API" из раздела "Подземелье магов" этого сайта:
InternetCheckConnection
позволяет узнать, есть ли уже соединение с Internet.
Синтаксис:
function InternetCheckConnection(lpszUrl: PAnsiChar;
dwFlags: DWORD;
dwReserved: DWORD): BOOL; stdcall;
Если нужно проверить, есть ли соединение по конкретному URL, то параметр lpszUrl должен содержать нужный URL; если интересует, есть ли соединение вообще, установите его в nil.
DwFlags может иметь значение только FLAG_ICC_FORCE_CONNECTION. Он делает следующее: если первый параметр не nil, то происходит попытка пропинговать указанный хост. Если параметр lpszUrl установлен в nil и есть соединение с другим сервером, то пингуется этот хост.
Последнее значение , dwReserved, зарезервировано, и должно быть установлено в 0.
К сожалению, я не проверял эту функцию, когда писал статью... а жаль... вот что получаеться: константа FLAG_ICC_FORCE_CONNECTION вообще не описана в Дельфи. более того - ее нет ни в Microsoft Visual C++ 5 (!!!!), VBasic 5 тоже! едва нашел в C++ Builder 5.
Вот описание -
const FLAG_ICC_FORCE_CONNECTION $00000001
Но! Даже с описанной константой ничего не работает так, как надо! Вот пример:
procedure TForm1.Button1Click(Sender: TObject);
var
h:boolean;
begin
h:= wininet.InternetCheckConnection(nil,$00000001,0);
if
h = True then
Label1.Caption:='Соеденение с сервером 127.0.0.1 установлено.'
else
if h = false
then
Label1.Caption:='Соеденения с сервером 127.0.0.1 нет.';
end;
Запускаю вместе с сервером - вроде должно пинговать его. Но первый раз функция показывает что соеденение есть несмотря на то, стоит ли сервер, или нет. Потом все время выдает false.
Если кто из читателей может пролить некоторый свет на проблему этой функции, очень прошу написать мне.
Благодарю Суркиза Максима, который впервые обратил мое внимание на проблему.
Если ты читал эту статью, советую прочитать до конца и/или повнимательнее.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.