Russian Qt Forum

Qt => Работа с сетью => Тема начата: zeonET от Май 25, 2010, 19:12



Название: Прием фрагментированного сообщения, 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() ?