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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: QSslSocket. Неизвестная кодировка в ответе от сервера.  (Прочитано 27447 раз)
Даниил
Гость
« Ответ #30 : Август 15, 2011, 09:30 »

А, собственно
Код:
while(pClient->bytesAvailable() != 0)
Не достаточно?
Записан
DmP
Гость
« Ответ #31 : Август 15, 2011, 09:36 »

А, собственно
Код:
while(pClient->bytesAvailable() != 0)
Не достаточно?
Нет, сокет может быть открыт, а буфер у него пустой - обычное дело.
Записан
Даниил
Гость
« Ответ #32 : Август 15, 2011, 10:12 »

Цитировать
Нет, сокет может быть открыт, а буфер у него пустой - обычное дело.
Что-то слабо верится, что люди могли выдумать настолько извращенную систему.
Ну, ладно. Раз смогли, быть таковому.
Как тогда нужно грамотно считывать данные?
Записан
DmP
Гость
« Ответ #33 : Август 15, 2011, 10:33 »

Цитировать
Нет, сокет может быть открыт, а буфер у него пустой - обычное дело.
Что-то слабо верится, что люди могли выдумать настолько извращенную систему.
Ну, ладно. Раз смогли, быть таковому.
Как тогда нужно грамотно считывать данные?
Вполне адекватная система, TCP пакеты имеют максимальный размер чуть более килобайта, естественно 100 Кб будет разбито на множество пакетов, какой то из пакетов придет вовремя, какой то задержится, да и системный буфер на чтение не безразмерный.
Serr500 хорошо описал алгоритм чтения, к тому же длина чанка всегда впереди его, можно опираться на нее, для контроля полученных данных.
Записан
DmP
Гость
« Ответ #34 : Август 15, 2011, 10:40 »

Плюс ко всему библиотека zlib позволяет читать потоковые данные, т.е. те что еще не получены до конца, если уж сильно хочется, то можно распаковывать все на лету.
Записан
Даниил
Гость
« Ответ #35 : Август 15, 2011, 11:11 »

Цитировать
Вполне адекватная система, TCP пакеты имеют максимальный размер чуть более килобайта, естественно 100 Кб будет разбито на множество пакетов, какой то из пакетов придет вовремя, какой то задержится, да и системный буфер на чтение не безразмерный.
Serr500 хорошо описал алгоритм чтения, к тому же длина чанка всегда впереди его, можно опираться на нее, для контроля полученных данных.
Да, все очень хорошо описана. Данным алгоритмом, я смог получить ровно то, что у меня и было - байт в байт! Ничего не изменилось ...
Записан
DmP
Гость
« Ответ #36 : Август 15, 2011, 11:18 »

Цитировать
Вполне адекватная система, TCP пакеты имеют максимальный размер чуть более килобайта, естественно 100 Кб будет разбито на множество пакетов, какой то из пакетов придет вовремя, какой то задержится, да и системный буфер на чтение не безразмерный.
Serr500 хорошо описал алгоритм чтения, к тому же длина чанка всегда впереди его, можно опираться на нее, для контроля полученных данных.
Да, все очень хорошо описана. Данным алгоритмом, я смог получить ровно то, что у меня и было - байт в байт! Ничего не изменилось ...
Хорошо, а где код, который разбирает полученную информацию на чанки?
Записан
Даниил
Гость
« Ответ #37 : Август 15, 2011, 12:27 »

Хорошо, а где код, который разбирает полученную информацию на чанки?

Пожалуйста:
Код:
{
        bool ok;
        QByteArray headers = "HTTP/1.1";            //Начало заголовка
        QByteArray dump;
        dump = pClient->readLine();                 //Считываем строку
        if(dump.contains(headers))                  //Если сообщение = заголовок HTTP ответа
        {
            dump = pClient->readAll();              //Считываем заголовок из буфера
        }
        else
        {
            while(true)
            {
                QString temp = dump;                //Промежуточное действия, для преобразования QByteArray в qint16
                qint16 chunk = temp.toInt(&ok, 10);
                if(!(chunk == 0))                   //Если длина чанка не нулевая
                {
                    dump = pClient->readLine(chunk);//Считываем кол-во информации = длину чанка
                    compressData.append(dump);      //Записываем информацию в глобальную переменную
                    dump = pClient->readLine();     //Считываем следующую строку, содержащую длину чанка
                }
                else break;
            }
        }
}
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #38 : Август 15, 2011, 13:31 »

Жесть какая-то.

Код
C++ (Qt)
if(dump.contains(headers))                  //Если сообщение = заголовок HTTP ответа
{
   dump = pClient->readAll();              //Считываем заголовок из буфера
}
Чего это мы заголовок-то считываем? Мы считываем заголовок, кодированные данные, возможно даже не 1 пакет. Возможно даже нецелые пакеты. Всё что есть в буфере на текущий момент.

Код
C++ (Qt)
qint16 chunk = temp.toInt(&ok, 10);
А потом это всё считанное пытаемся превратить в число. Ничего из этого, разумеется не выходит. Мы получаем ноль и выходим.

Если бы получили не 0, то удачно бы выкинули всё, что считали в дамп и начали бы читать новую строку. Веселый
Записан
Даниил
Гость
« Ответ #39 : Август 15, 2011, 13:33 »

Жесть какая-то.

Код
C++ (Qt)
if(dump.contains(headers))                  //Если сообщение = заголовок HTTP ответа
{
   dump = pClient->readAll();              //Считываем заголовок из буфера
}
Чего это мы заголовок-то считываем? Мы считываем заголовок, кодированные данные, возможно даже не 1 пакет. Возможно даже нецелые пакеты. Всё что есть в буфере на текущий момент.

Код
C++ (Qt)
qint16 chunk = temp.toInt(&ok, 10);
А потом это всё считанное пытаемся превратить в число. Ничего из этого, разумеется не выходит. Мы получаем ноль и выходим.

Если бы получили не 0, то удачно бы выкинули всё, что считали в дамп и начали бы читать новую строку. Веселый

Может поспорим?  Веселый

В смысле, очень интересное замечание. Поясните, пожалуйста, на конкретном примере. Как мне необходимо было поступить.

И да, обратите внимание на конструкцию if, else.
« Последнее редактирование: Август 15, 2011, 13:38 от Даниил » Записан
DmP
Гость
« Ответ #40 : Август 15, 2011, 18:58 »

Хорошо, а где код, который разбирает полученную информацию на чанки?

Пожалуйста:
Код:
                QString temp = dump;                //Промежуточное действия, для преобразования QByteArray в qint16
                qint16 chunk = temp.toInt(&ok, 10);
Код конечно оставляет желать лучшего, но что можно сказать:
1) Его лучше разбить на два отдельных цикла, один разбирает заголовок, второй разбирает чанки;
2) У QByteArray тоже есть toInt();
3) Почему длина чанка считается по основанию 10?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #41 : Август 15, 2011, 19:17 »

2) У QByteArray тоже есть toInt();
А я что говорил, что её нет?
Только если мы считали строку "HTTP/1.1 200 OK" и дальше по readAll() у нас в дамп попадает "Content-Encoding: gzip\nContent-Type: …" то toInt не сможет привести к числу, вернёт 0, а в ok запишет false.
Записан
DmP
Гость
« Ответ #42 : Август 15, 2011, 19:22 »

2) У QByteArray тоже есть toInt();
А я что говорил, что её нет?
Каждый из нас центр вселенной Улыбающийся
Записан
Даниил
Гость
« Ответ #43 : Август 15, 2011, 19:46 »

Только если мы считали строку "HTTP/1.1 200 OK" и дальше по readAll() у нас в дамп попадает "Content-Encoding: gzip\nContent-Type: …" то toInt не сможет привести к числу, вернёт 0, а в ok запишет false.

1) Мы считываем сообщение заголовка - его мы никуда не преобразовываем.
2) Уже после того, как мы счиали заголовок - проводиться проверка. Если  строка не содержит ту дребедень, то пойдут уже преобразования.

И да, собственно проблема остается актуальной, информация вид не меняет. Считываю я по основанию 10 или по 16. Вид остается прежним, абсолютно не несущим информацию. Есть идеи по поводу расжимания?
Записан
DmP
Гость
« Ответ #44 : Август 15, 2011, 19:58 »

И да, собственно проблема остается актуальной, информация вид не меняет. Считываю я по основанию 10 или по 16. Вид остается прежним, абсолютно не несущим информацию. Есть идеи по поводу расжимания?
Сначала бы хотелось бы взглянуть на результат выделения чанков, на примере ранее полученного ответа от сервера.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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