Название: Прием фрагментированного сообщения, Network operation timed out
Отправлено: zeonET от Май 25, 2010, 19:12
Пробую принять на сервере фрагментированное сообщение. Клиент отсылает в формате: длина_данных + данные клиент: QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_4); out << (quint64)0; // reserve for msg len out << (qreal)version; //write protocol version: out << outgoingBuffer; out.device()->seek(0); out << (quint64)(block.size() - sizeof(quint64));
sslSocket->write(block); прием на сервере слот readData: void ConnectionThread::readData() { QDataStream in(sslSocket); in.setVersion(QDataStream::Qt_4_4);
quint64 byteCount = 0; qreal version = 0; while(sslSocket->isValid() && byteCount < sizeof(quint64)) { sslSocket->waitForReadyRead(100); byteCount = sslSocket->bytesAvailable(); if (workaround>300) { return; } else workaround++; }
in >> blockSize;
workaround = 0; while(sslSocket->isValid() && byteCount < blockSize) { sslSocket->waitForReadyRead(100); byteCount = sslSocket->bytesAvailable();
if (workaround>300) { return; } else workaround++; }
//read protocol version in >> version; // read message in >> incomingBuffer;
// обработка данных
Так вот когда приходит первая часть фрагментированного сообщения, я получаю размер данных, и пробую подождать когда придут остальные данные waitForReadyRead(100), но получаю ошибку "Network operation timed out". Потом, когда происходит выход с ф-и readData через workaround, я снова попадаю в readData, видимо readyRead() сигнал был вызван... Как мне правильно поступить и получить все данные в середине слота?
Название: Re: Прием фрагментированного сообщения, Network operation timed out
Отправлено: crossly от Май 25, 2010, 19:40
а зачем waitForReadyRead(100) в слоте??.... когда придут новые данный будет послан сигнал readyRead и вызван твой слот... и можно спокойно продолжать чтение... и так до тех пор пока не будет прочитано нужное кол-во байт...
Название: Re: Прием фрагментированного сообщения, Network operation timed out
Отправлено: zeonET от Май 25, 2010, 22:51
да, я так тоже подумал когда запостил сообщение и уже немного изменил слот и вроде как работает ), спасибо за отзыв! теперь он у меня такой(может кому-то пригодится): void ConnectionThread::readData() { if (!sslSocket->isValid()){ return; }
QDataStream in(sslSocket); in.setVersion(QDataStream::Qt_4_4);
quint64 byteCount = 0; qreal version = 0; byteCount = sslSocket->bytesAvailable();
if (byteCount < sizeof(quint64)) return;
if (!blockSize){ in >> blockSize; byteCount = sslSocket->bytesAvailable(); } // if bytesAvailable less than blockSize we expecting, we should wait for data if (byteCount < blockSize) return;
//read protocol version in >> version; blockSize = 0; // read message in >> incomingBuffer;
// parsing data, etc... ..... }
Переменная blockSize обьявлена в класе ConnectionThread. Но все-равно интерестно, можно ли в слоте подождать как-то или только через сигнал readyRead() ?
|