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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [Решено] Синхронная работа  (Прочитано 9639 раз)
kobra
Гость
« : Июль 17, 2012, 01:12 »

Сейчас прохожу кур по криптографии со Стенфорда и там есть одна задачка.
Нужно все время проверять что сервер отвечает на различние параметри в url. Ответ или 403 или 404. Как с помощью Qt можна получить код ошибки, причем моя програма должна остановиться и ждать ответа.

Читал хелп то там рнашел не очень понятний пример для ассинхронной работи и также в классе QNetworkReply не нашел кодом ошибок 403 и 404
« Последнее редактирование: Июль 22, 2012, 13:58 от kobra » Записан
Bepec
Гость
« Ответ #1 : Июль 17, 2012, 06:50 »

Как бы сказать - сервер вам наверно в ответ формирует страницу, на которой отображен номер ошибки и её описание. Вам всего-то надо ей прочитать.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Июль 17, 2012, 07:06 »

Заголовки должны быть соответствующие.
Типа:
Код
Status: HTTP/1.1 404 Not Found
Записан
QtCoder
Гость
« Ответ #3 : Июль 17, 2012, 07:12 »

NetworkError QNetworkReply::error () const
QNetworkReply::ContentNotFoundError   203   the remote content was not found at the server (similar to HTTP error 404)
Записан
SimpleSunny
Гость
« Ответ #4 : Июль 17, 2012, 23:31 »

QVariant   QNetworkReply::attribute ( QNetworkRequest::Attribute code ) const
QNetworkRequest::HttpStatusCodeAttribute
Записан
kobra
Гость
« Ответ #5 : Июль 20, 2012, 18:01 »

Что-то у меня не получаеться сделать правильно...
Написал класс у которого в одном из методов есть следующей код:

Код:
QNetworkRequest request;
request.setUrl(QUrl(readyQuery));
qDebug() << readyQuery;
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));

while(!gettedError);

В основном код переписал из документации.
В консоль печатаеться следующей линк:

http://crypto-class.appspot.com/po?er=0000000000000000000000000000000158b1ffb4210a580f748b4ac714c001bd

не трудно проверить что он введет на страницу с ошибкой 403.
в слоте slotError(QNetworkReply::NetworkError) переменную gettedError я устанавливаю в true.
в результате программа зависает.
Записан
mutineer
Гость
« Ответ #6 : Июль 21, 2012, 11:50 »

А каким образом должен выполниться slotError, если поток выполнения застрял на while(!gettedError); ?
Записан
kobra
Гость
« Ответ #7 : Июль 21, 2012, 13:22 »

а что я должен сделать чтоб он выполнился?
просто остановить свой главный поток и ждать или нужно вызвать какой нибудь метод?
Записан
mutineer
Гость
« Ответ #8 : Июль 21, 2012, 20:18 »

а что я должен сделать чтоб он выполнился?
просто остановить свой главный поток и ждать или нужно вызвать какой нибудь метод?
Почему бы нужный код не выполнить прям в slotError? и не мутить это странное ожидание.
Записан
kobra
Гость
« Ответ #9 : Июль 21, 2012, 20:31 »

поставил return все работает
а нельзя сделать так чтоб программа просто ждала ответа, а потом вернулась к тому места где остановилась?
Записан
mutineer
Гость
« Ответ #10 : Июль 21, 2012, 20:34 »

Запустить локальный евент-луп, а при приходе ответа вызвать ему exit()

З.Ы. фиг знает куда ты return поставил и что у тебя заработало
Записан
kobra
Гость
« Ответ #11 : Июль 21, 2012, 22:31 »

работает значит что вызываеться слот slotError и выводит в консоль номер ошибки

у меня есть метод который в цикле должен делать запросы к серверу
чтоб все заработало мне пришлось поставить return который останавливает метод.
в результате счас мне придеться шаманить чтоб все переделать, а хотелось б чтоб моя программа просто остановилась и ждала ответа, а потом продолжила работу в цикле
Записан
mutineer
Гость
« Ответ #12 : Июль 21, 2012, 22:58 »

работает значит что вызываеться слот slotError и выводит в консоль номер ошибки

у меня есть метод который в цикле должен делать запросы к серверу
чтоб все заработало мне пришлось поставить return который останавливает метод.
в результате счас мне придеться шаманить чтоб все переделать, а хотелось б чтоб моя программа просто остановилась и ждала ответа, а потом продолжила работу в цикле

Код будет понятнее этих маханий руками в воздухе
Записан
kobra
Гость
« Ответ #13 : Июль 22, 2012, 01:43 »

Код:
void Crypto::run()
{
/// проходимся по каждому блоку
    for(int i = 0; i < 3; i++)
    {
     /// проходимся по каждому байту
        for(int j = 0; j < 16; j++)
        {
         /// пробуем угадать байт
            while(true)
            {
                QString readyQuery = url + stringToHex(guess) + unknown;
                gettedError = false;
                QNetworkRequest request;
                request.setUrl(QUrl(readyQuery));
                qDebug() << readyQuery;
                request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

                QNetworkReply *reply = manager->get(request);
                connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
                connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
                        this, SLOT(slotError(QNetworkReply::NetworkError)));
                connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
                        this, SLOT(slotSslErrors(QList<QSslError>)));
               
                while(!gettedError);
                /// в етом месте мне нужно какая ошибка (403 или 404) чтоб знать что делать дальше

            }
        }
    }
}

void Crypto::slotError(QNetworkReply::NetworkError a)
    {
        gettedError = true;
    }

Оставил только основное.
Еще раз задача. Есть три блока в каждом по 16 байт. Нам нужно их всех разгадать. Каждый байт разгадываем следующем путем: мы предполагаем что наш байт равен x, далее на основе нашего предположения строим адрес страницы. Если угадали то в ответ получаем 404, иначе 403. Тойсть мне в худшем случае нужно 3 * 16 * 256 = 12288 запросов.
Записан
mutineer
Гость
« Ответ #14 : Июль 22, 2012, 10:04 »

можешь вместо while(!gettedError); запустить локальный eventLoop и вместо gettedError = true; делать из него exit
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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