Название: Как правильно пропинговать сайт? Отправлено: 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 ) 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) // сюда попадаем, когда выполнился запрос на всякий случай, нужно проверять не errorString(), а собственно значение переменной error, или пробовать метод QHttp::error () ; { QString st = http->errorString();// смотрим была ли ошибка // если нет, то ОК, иначе проверяем на код ошибки QHttp::HostNotFound и если true, решаем что нет подключения } просто обычно в Qt ф-ции типа errorString() всегда возвращают какое-то значение, даже если ошибки не было |