Russian Qt Forum
Ноябрь 23, 2024, 09:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно пропинговать сайт?  (Прочитано 15341 раз)
Alex_M
Гость
« : Декабрь 14, 2009, 17:24 »

Здравствуйте, подскажите пожалуйста, как пропинговать сайт посредством Qt (необходимо для проверки наличия Интернета у пользователя)? И еще вопросик - как можно узнать, что удаленного документа, к которому посылается http-запрос, не существует (ошибка 404)?
Записан
niXman
Гость
« Ответ #1 : Декабрь 14, 2009, 17:43 »

QProcess + ping + parsing
Записан
sendevent
Гость
« Ответ #2 : Декабрь 14, 2009, 19:24 »

Цитировать
И еще вопросик - как можно узнать, что удаленного документа, к которому посылается http-запрос, не существует (ошибка 404)?
0: прекращаем задавать больше одного вопроса в одной теме;
1: вебпейджу говорим setForwardUnsupportedContent( true );
2: цепляемся к сигналу QWebPage::unsupportedContent(QNetworkReply*):
Код:
void MyImpl::slotHandleUnsupportedContent( QNetworkReply *pReply )
{
    if( pReply->error() == QNetworkReply::NoError )
    {
        //-- there is no error - it's file downloading, etc., process it:
        ...
        return;
    }
   
    //-- look at
    //-- QNetworkReply::NetworkError
    //-- and/or
    //-- QNetworkRequest::Attribute
    ...
}
3: ...
4: PROFIT!
Записан
prometey
Гость
« Ответ #3 : Декабрь 14, 2009, 19:50 »

отсутствие "пинга" еще не означает недоступность узла. icmp пакеты могут быть запрещены сетевыми фильтрами. в моей практике почемуто почти всегда так и получалось Улыбающийся видимо админы были очень добросовесными )) я бы предложил другой вариант - получение заголовка какой-нидь страницы известного "надежного" сервера. например гугла. ну или что там всегда работает... если подумать - то наличие интернета наверное необходимо для фонового доступа к какому-нибудь ресурсу... можно просто попробовать подключиться к нему Улыбающийся
« Последнее редактирование: Декабрь 14, 2009, 20:26 от prometey » Записан
Alex_M
Гость
« Ответ #4 : Декабрь 15, 2009, 13:42 »

Постараюсь более подробно описать проблему. Необходимо определить подключен или нет компьютер пользователя к Интернету. Двигался двумя путями - посредством QHttp или QNetworkAccessManager (проблемы аналогичны QHttp).
В первом случае:
http = new QHttp(this); // создал подключение
connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(httpRequestFinished(int, bool))); // по завершению запроса - смотрим была ошибка или нет
QString u = "http://www.google.ru/";
QUrl url;
url.setUrl(u);
QHttp::ConnectionMode mode = url.scheme().toLower() == "https" ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp;
http->setHost(url.host(), mode, url.port() == -1 ? 0 : url.port());
QHttpRequestHeader header ("GET", url.path());
header.setValue("Host", url.host());
http->request(header); // посылаем запрос
void interfaces::httpRequestFinished(int requestId, bool error) // сюда попадаем, когда выполнился запрос
{
QString st = http->errorString();// смотрим была ли ошибка
// если нет, то ОК, иначе проверяем на код ошибки QHttp::HostNotFound и если true, решаем что нет подключения
}
Вроде все должно быть в порядке, но не работает:
a - какой url не передаем, хоть и нормальный (http://www.google.ru/), хоть и полную ерунду ("http://www.jasfiojnfoq.ru/"), в строке st - всегда значение "Unknown error"
б - если просто отключаю Интернет, то в метод httpRequestFinished программа не заходит (типо никогда не завершается request).
В QNetworkAccessManager использую такую же методику и теже проблемы - пункты а и б
Записан
Alex_M
Гость
« Ответ #5 : Декабрь 15, 2009, 13:46 »

QProcess + ping + parsing
не понял малость эту методику? (вызывать чтоли cmd.exe, как процесс и передавать параметр ping google.ru)?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Декабрь 15, 2009, 17:38 »

Абсолютно правильно. А дальше парсить вывод.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
whirlwind
Гость
« Ответ #7 : Декабрь 15, 2009, 19:21 »

void interfaces::httpRequestFinished(int requestId, bool error) // сюда попадаем, когда выполнился запрос
{
QString st = http->errorString();// смотрим была ли ошибка
// если нет, то ОК, иначе проверяем на код ошибки QHttp::HostNotFound и если true, решаем что нет подключения
}
на всякий случай, нужно проверять не errorString(), а собственно значение переменной error, или пробовать метод QHttp::error () ;
просто обычно в Qt ф-ции типа errorString() всегда возвращают какое-то значение, даже если ошибки не было
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.