Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Апрель 27, 2012, 20:51



Название: Как программно проверить есть подключение к интернет?
Отправлено: virtual_root от Апрель 27, 2012, 20:51
Ещё раз здравствуйте) Ребята, может кто-то уже занимался подобным? Мне в моей программе нужно чтобы когда нет соединения с интернет иконка в трее менялась. Я использовала следуйщий способ:
Код:
QNetworkConfigurationManager config;
if (config.isOnline())
        emit Onlain(true);
else
        emit Onlain(false);
   

Далее я сделала таймер и по сигналу timeout я в слоте выполняю этот код. Timeout у меня каждые 2 секунды.
Всё работает, картинка меняется, но не так быстро, как например в скайп. Т.е. я отключаюсь от интернет и моё приложение только секунд через 5-6 меняет картинку. А хотелось бы как в скайп, он как-то сразу меняет картинку.)
Может кто знает решение?


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: alexis031182 от Апрель 27, 2012, 21:03
Так у QNetworkConfigurationManager есть сигнал onlineStateChanged() :)


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: virtual_root от Апрель 27, 2012, 21:15
А как бы мне этот сигнал использовать? Когда он срабатывает? Я соединила его со своим объектом, но сам сигнал не вызывается...
Не могли бы вы привести пример кода, если конечно возможно.


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: alexis031182 от Апрель 27, 2012, 22:00
Очень странно, но у меня тоже не работает. Не работает и кьютишный пример BearerMonitor - всегда online, сигнал не вызывается :(


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: virtual_root от Апрель 27, 2012, 22:07
Да, странно. У меня мой код который я выше писала работает только под windows под ubuntu тоже всегда onlain...


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: Alex_C от Апрель 27, 2012, 22:11
Не знаю как сейчас, может что уже новое придумали...
Но в свое время данный вопрос меня интересовал.
Для начала давайте разберемся - что значит подключен к интернету, или нет?
Однозначно можно определить только подключен компьютер к сети (не к интернету, а к комп. сети!) или нет (если не подключен, то при запросе его ip будет выдаваться 127.0.0.1).
Ситуация - порушились часть каналов у Вашего провайдера - google - не доступен, yandex - доступен. Это как - интернет есть или нет? Скайп проверяет работоспособность не итернета, скажем так, а доступность своего сервера пингуя его.
Как вариант - пингуйте www.google.ru и www.yandex.ru, перед этим проверяя, что Ваш ip не 127.0.0.1


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: alexis031182 от Апрель 27, 2012, 22:12
Да, странно. У меня мой код который я выше писала работает только под windows под ubuntu тоже всегда onlain...
Вот-вот, у меня Mint, но по сути та же Ubuntu. Попробовал ещё QNetworkAccessManager (там похожий сигнал есть) - аналогично, не пашет.

Тогда наверное только с таймером проверять, больше вроде нет ничего, что могло бы отправить сигнал. Ещё есть QNetworkInterface, но у него только функция проверки через флаг QNetworkInterface::IsUp


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: alexis031182 от Апрель 27, 2012, 22:15
Не знаю как сейчас, может что уже новое придумали...
Но в свое время данный вопрос меня интересовал.
Для начала давайте разберемся - что значит подключен к интернету, или нет?
Однозначно можно определить только подключен компьютер к сети (не к интернету, а к комп. сети!) или нет (если не подключен, то при запросе его ip будет выдаваться 127.0.0.1).
Да, точно, только вот как раз хотелось бы, чтобы localhost при определении активности сети из списка исключался. А тут походу нет. Кабель выдергиваю, и всё равно онлайн.

Ситуация - порушились часть каналов у Вашего провайдера - google - не доступен, yandex - доступен. Это как - интернет есть или нет? Скайп проверяет работоспособность не итернета, скажем так, а доступность своего сервера пингуя его.
Как вариант - пингуйте www.google.ru и www.yandex.ru, перед этим проверяя, что Ваш ip не 127.0.0.1
Придётся постоянно пинговать, а ради смены иконки - это наверное не слишком удачно.


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: Alex_C от Апрель 27, 2012, 22:22
Кабель выдергиваю, и всё равно онлайн.

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


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: alexis031182 от Апрель 27, 2012, 22:34
Такая ситуация как бы не правильна - при выдергивании всех (заметте - всех) сетей, адрес должен стать 127.0.0.1 - если такого не происходит - то скорее всего "не все выдернули".
Выдернул всё, и адрес конечно остался только 127.0.0.1  Я как раз и хотел сказать, что localhost, по идее, должен игнорироваться самой Qt при определении доступности сети. А иначе, я должен тогда карту отключить получается, чтобы на оффлайн перевести. Скорее всего этот функционал в приоритете на мобильные платформы делался, там может быть такой двусмысленности не возникает.

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


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: virtual_root от Апрель 27, 2012, 23:03
Ребята спасибо за ответы.


Название: Re: Как программно проверить есть подключение к интернет?
Отправлено: Bepec от Апрель 28, 2012, 06:52
Кхм. А никому в голову не приходило, что имеются и эмуляторы на компьютерах? И что 127.0.0.1 - совсем не верный способ определения, есть сеть или нет?


Название: Re: Как программно проверить есть подключен&#
Отправлено: Alex_C от Апрель 28, 2012, 08:02
Кхм. А никому в голову не приходило, что имеются и эмуляторы на компьютерах? И что 127.0.0.1 - совсем не верный способ определения, есть сеть или нет?


Моя фраза о том "что не все выдернули" - именно к этому и относится. По этому она и в кавычках.
Даже такой вот пример - модем Мегафоновский - если воткнут, но денег на счете нет, но адрес то есть, а интернета нет :)
По этому , как мне кажется, если есть дейcтвительно необходимость проверки интернета - пинговать допустим 3 наиболее вероятно работающих сервера, типа google.

Вообще же рекомендую погуглить - ссылок на эту тему много найдете.