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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прием фрагментированного сообщения, Network operation timed out  (Прочитано 3193 раз)
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() сигнал был вызван... Как мне правильно поступить и получить все данные в середине слота?


« Последнее редактирование: Май 25, 2010, 19:16 от zeonET » Записан
crossly
Гость
« Ответ #1 : Май 25, 2010, 19:40 »

а зачем waitForReadyRead(100) в слоте??.... когда придут новые данный будет послан сигнал readyRead и вызван твой слот... и можно спокойно продолжать чтение... и так до тех пор пока не будет прочитано нужное кол-во байт...
Записан
zeonET
Гость
« Ответ #2 : Май 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() ?
« Последнее редактирование: Май 25, 2010, 22:53 от zeonET » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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