Название: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: Ruzzz от Августа 13, 2009, 00:47 Т.е. если я использую QDataStream in(tcpSocket), то in возьмет на себя получение всех частей(чанков)? И мне просто остается пользоватся оператором in >> MY_VAR, но все еще следует проверять перед чтением этим tcpSocket->bytesAvailable(), так ли?
Если так, то могу ли я все это проделать при самом первой посылке readyRead от tcpSocket? Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: Ruzzz от Августа 13, 2009, 00:56 И еще вопрос по readAll, он дает гарантию что прочитает все за один раз? Или нужно использовать что то типа:
Код
Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: Ruzzz от Августа 13, 2009, 00:59 Интересует именно обработка в qt заголовка 'CHUNKED', хотя может и еще какие нюансы есть
Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: kuzulis от Августа 13, 2009, 08:18 Цитировать И еще вопрос по readAll, он дает гарантию что прочитает все за один раз? Неа, если глянуть в исходники , то максимум за раз может прочитать <=4096 байт (если не путаю)! т.е. прочитает ВСЕ что пришло в сокет - но это не значит что это ВСЕ - есть ВСЁ ! :) А обязательно использовать QDataStream ? Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: kuzulis от Августа 13, 2009, 08:32 И я бы например читал вот таким макаром (пример без использования сигнала readyRead):
Код: ... Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: Ruzzz от Августа 13, 2009, 10:23 да исходники я изучаю, не всегда получается разобраться в них (
Тогда еще вопрос, почему это «if (bav > 0) … else return ошибка;» — разве это ошибка? Или если sock->waitForReadyRead вернул true, но прочитали 0 байт, значит ошибка? Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: kuzulis от Августа 13, 2009, 11:36 Цитировать Тогда еще вопрос, почему это «if (bav > 0) … else return ошибка;» — разве это ошибка? Или если sock->waitForReadyRead вернул true, но прочитали 0 байт, значит ошибка? в данном случае - ДА! т.к. если ret = true - то это значит что пришел хотябы 1 байт пакета, и если после этого bytesAvailable вернет 0 - то значит это ошибка, т.к. вернуть должно >0Название: Re: QDataStream in(tcpSocket), теперь readyRead от tcpSocket идут в in, так? Отправлено: Ruzzz от Августа 13, 2009, 21:12 Неа, если глянуть в исходники , то максимум за раз может прочитать <=4096 байт (если не путаю)! Похоже что путаете ) Вот из qiodevice.cpp для QByteArray QIODevice::readAll():Код
Как видим - пытаемся прочитать минимум 4096, а максимуи сколько дают :) Причем в цикле пытаемся и пытаемся читать. И если мы ждем что нам должны что-то прислать, то только какая-либо ошибка может помешать нам считать все пришедшие данные. По-моему так. Да и как видим если мы используем ReadAll, то перед этим не нужно проверять этим bytesAvailable, просто ReadAll это сделает, хотя все зависит от ситуации. В вот для read возможно стоит также проверить то что возвращает она. Вообще вот: Код То есть bytesAvailable просто возвращает разницу размера и позиции внутреннего буфера. Так что я бы лучше проверял что возвращают функции read |