Russian Qt Forum

Qt => Работа с сетью => Тема начата: Alex_M от Декабря 14, 2009, 17:24



Название: Как правильно пропинговать сайт?
Отправлено: Alex_M от Декабря 14, 2009, 17:24
Здравствуйте, подскажите пожалуйста, как пропинговать сайт посредством Qt (необходимо для проверки наличия Интернета у пользователя)? И еще вопросик - как можно узнать, что удаленного документа, к которому посылается http-запрос, не существует (ошибка 404)?


Название: Re: Как правильно пропинговать сайт?
Отправлено: niXman от Декабря 14, 2009, 17:43
QProcess + ping + parsing


Название: Re: Как правильно пропинговать сайт?
Отправлено: sendevent от Декабря 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!


Название: Re: Как правильно пропинговать сайт?
Отправлено: prometey от Декабря 14, 2009, 19:50
отсутствие "пинга" еще не означает недоступность узла. icmp пакеты могут быть запрещены сетевыми фильтрами. в моей практике почемуто почти всегда так и получалось :) видимо админы были очень добросовесными )) я бы предложил другой вариант - получение заголовка какой-нидь страницы известного "надежного" сервера. например гугла. ну или что там всегда работает... если подумать - то наличие интернета наверное необходимо для фонового доступа к какому-нибудь ресурсу... можно просто попробовать подключиться к нему :)


Название: Re: Как правильно пропинговать сайт?
Отправлено: Alex_M от Декабря 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 использую такую же методику и теже проблемы - пункты а и б


Название: Re: Как правильно пропинговать сайт?
Отправлено: Alex_M от Декабря 15, 2009, 13:46
QProcess + ping + parsing
не понял малость эту методику? (вызывать чтоли cmd.exe, как процесс и передавать параметр ping google.ru)?


Название: Re: Как правильно пропинговать сайт?
Отправлено: Пантер от Декабря 15, 2009, 17:38
Абсолютно правильно. А дальше парсить вывод.


Название: Re: Как правильно пропинговать сайт?
Отправлено: whirlwind от Декабря 15, 2009, 19:21
void interfaces::httpRequestFinished(int requestId, bool error) // сюда попадаем, когда выполнился запрос
{
QString st = http->errorString();// смотрим была ли ошибка
// если нет, то ОК, иначе проверяем на код ошибки QHttp::HostNotFound и если true, решаем что нет подключения
}
на всякий случай, нужно проверять не errorString(), а собственно значение переменной error, или пробовать метод QHttp::error () ;
просто обычно в Qt ф-ции типа errorString() всегда возвращают какое-то значение, даже если ошибки не было