Russian Qt Forum

Qt => Работа с сетью => Тема начата: kobra от Июль 17, 2012, 01:12



Название: [Решено] Синхронная работа
Отправлено: kobra от Июль 17, 2012, 01:12
Сейчас прохожу кур по криптографии со Стенфорда и там есть одна задачка.
Нужно все время проверять что сервер отвечает на различние параметри в url. Ответ или 403 или 404. Как с помощью Qt можна получить код ошибки, причем моя програма должна остановиться и ждать ответа.

Читал хелп то там рнашел не очень понятний пример для ассинхронной работи и также в классе QNetworkReply не нашел кодом ошибок 403 и 404


Название: Re: Синхронная работа
Отправлено: Bepec от Июль 17, 2012, 06:50
Как бы сказать - сервер вам наверно в ответ формирует страницу, на которой отображен номер ошибки и её описание. Вам всего-то надо ей прочитать.


Название: Re: Синхронная работа
Отправлено: LisandreL от Июль 17, 2012, 07:06
Заголовки должны быть соответствующие.
Типа:
Код
Status: HTTP/1.1 404 Not Found


Название: Re: Синхронная работа
Отправлено: QtCoder от Июль 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)


Название: Re: Синхронная работа
Отправлено: SimpleSunny от Июль 17, 2012, 23:31
QVariant   QNetworkReply::attribute ( QNetworkRequest::Attribute code ) const
QNetworkRequest::HttpStatusCodeAttribute


Название: Re: Синхронная работа
Отправлено: kobra от Июль 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.
в результате программа зависает.


Название: Re: Синхронная работа
Отправлено: mutineer от Июль 21, 2012, 11:50
А каким образом должен выполниться slotError, если поток выполнения застрял на while(!gettedError); ?


Название: Re: Синхронная работа
Отправлено: kobra от Июль 21, 2012, 13:22
а что я должен сделать чтоб он выполнился?
просто остановить свой главный поток и ждать или нужно вызвать какой нибудь метод?


Название: Re: Синхронная работа
Отправлено: mutineer от Июль 21, 2012, 20:18
а что я должен сделать чтоб он выполнился?
просто остановить свой главный поток и ждать или нужно вызвать какой нибудь метод?
Почему бы нужный код не выполнить прям в slotError? и не мутить это странное ожидание.


Название: Re: Синхронная работа
Отправлено: kobra от Июль 21, 2012, 20:31
поставил return все работает
а нельзя сделать так чтоб программа просто ждала ответа, а потом вернулась к тому места где остановилась?


Название: Re: Синхронная работа
Отправлено: mutineer от Июль 21, 2012, 20:34
Запустить локальный евент-луп, а при приходе ответа вызвать ему exit()

З.Ы. фиг знает куда ты return поставил и что у тебя заработало


Название: Re: Синхронная работа
Отправлено: kobra от Июль 21, 2012, 22:31
работает значит что вызываеться слот slotError и выводит в консоль номер ошибки

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


Название: Re: Синхронная работа
Отправлено: mutineer от Июль 21, 2012, 22:58
работает значит что вызываеться слот slotError и выводит в консоль номер ошибки

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

Код будет понятнее этих маханий руками в воздухе


Название: Re: Синхронная работа
Отправлено: kobra от Июль 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 запросов.


Название: Re: Синхронная работа
Отправлено: mutineer от Июль 22, 2012, 10:04
можешь вместо while(!gettedError); запустить локальный eventLoop и вместо gettedError = true; делать из него exit


Название: Re: Синхронная работа
Отправлено: kobra от Июль 22, 2012, 13:57
спасибо как раз то что мне нужно


Название: Re: [Решено] Синхронная работа
Отправлено: mutineer от Июль 22, 2012, 15:14
А чем не устроило когда я первый раз это решение называл?