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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4.4.0 - проблемы с QTcpSocket  (Прочитано 4319 раз)
ElderOrb
Гость
« : Июль 04, 2008, 15:48 »

По каким-то причинам при интенсивном приёме множества маленьких пакетов ( < 100 байт) начинает плохо работает QTcpSocket::readAll.
Точнее сказать мы крутимся в цикле внутри функции qint64 QAbstractSocket::readData(char *data, qint64 maxSize) и никогда из него не выходим. Вот этот конкретный кусок кода:
 
Код:
  while (readSoFar < bytesToRead) {
        const char *ptr = d->readBuffer.readPointer();
        int bytesToReadFromThisBlock = qMin(int(bytesToRead - readSoFar),
                                            d->readBuffer.nextDataBlockSize());
        memcpy(data + readSoFar, ptr, bytesToReadFromThisBlock);
        readSoFar += bytesToReadFromThisBlock;
        d->readBuffer.free(bytesToReadFromThisBlock);
    }

Причем что интересно, вначале (секунд 5-10) всё нормально, а потом происходит вышеописанное. Что за дьявольщина? Проверял под 4.3.3 - та же херня, что навевает мысли о том что я где-то не правильно использую QTcpSocket. Хотя я ничего кроме readAll по сигналу readyRead не делаю.. Да, вот ещё, я пробовал асинхронный сокет в гуёвом потоке/рабочем потоке - из изменений только логичное не-зависание гуя, в остальном всё так же. Что это может быть и что ещё можно проверить?
Записан
Zmeishe
Гость
« Ответ #1 : Июль 04, 2008, 20:10 »

Ну на вскидку, не вдаваясь в подробности, могу скопипастить сюда свой кусок кода, стабильно работающий около трёх лет.
Немного урезанный.
Первое, что записано в сокет - это размер передаваемых данных, пока всё не пришло - ждёмс.
И только потом начинаем разбор.
Код:
quint64 byteCount = 0; 
while(pSocket->isValid() && byteCount < sizeof(quint64))
 {   
     pSocket->waitForReadyRead(100);
     byteCount = pSocket->bytesAvailable();     
 }

 in >> blockSize;

 while(pSocket->isValid() && byteCount < blockSize)
 {
     pSocket->waitForReadyRead(100);
     byteCount = pSocket->bytesAvailable();
 }
// Когда пришло всё, что нужно, начинаем разбор
...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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