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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt4 Server/Client  (Прочитано 6567 раз)
moroz
Гость
« : Март 09, 2007, 20:59 »

Непонимаю, что я делаю неправильно. Мой сервер высылает пиксмап и позицию QPoint

Код:
void Server::sendToClient()
{
    QTcpSocket *clientSocket = (QTcpSocket*)sender();
    QByteArray arr;
    QBuffer buffer(&arr);
    buffer.open(QIODevice::WriteOnly);

    QPixmap pix(200, 200);
    pix.fill(Qt::red);

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << quint16(0) << arr << QPoint(23, 23);

    out.device()->seek(0);
    out << quint16(block.size() - sizeof(qint16));

    clientSocket->write(block);
}


Клиент принимает данные от сервера в слоте
Код:

void Client::readyRead()
{
    QDataStream in(_tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    while(1) {
        if (!_blockSize) {
            if (_tcpSocket->bytesAvailable() < sizeof(quint16)) {
                break;
            }
            in >> _blockSize;
        }
        if (_tcpSocket->bytesAvailable() < _blockSize) {
            break;
        }

        QByteArray buf;
        QPoint pt;
        in >> buf >> pt;

        _blockSize = 0;
    }
}

Все работает пока пиксмап вписывается в один блок, но если изменить размер пиксма например 2000x2000, то клиент получает несколько пакетов и тут происходит самое интересное метод bytesAvailable() сообщает, что в сокет содержит данные, но из потока in ничего не считывается тоесть buf.size() после in >> buf >> pt; равно нулю. Но если вызвать из _tcpSocket  вызвать метод read(buf, _tcpSocket->bytesAvailable()), то данные можно считать.
Я в шоке. Кто-нибудь уже сталкивался с такой проблемой?
Что я делаю неправильно? Подскажите пожалуйста
Записан
Mixolap
Гость
« Ответ #1 : Март 09, 2007, 21:45 »

bool QIODevice::waitForBytesWritten ( int msecs )
bool QIODevice::waitForReadyRead ( int msecs )

А если добавить в код использование этих функций?
Записан
moroz
Гость
« Ответ #2 : Март 10, 2007, 12:56 »

Поставил ожидание на 500мс, результат тот же только медленее  
Но, все равно огромное спасибо
Записан
Alex03
Гость
« Ответ #3 : Март 10, 2007, 17:06 »

Для начала поглядите что у Вас возвращает clientSocket->write(block)
Записан
moroz
Гость
« Ответ #4 : Март 10, 2007, 19:34 »

Спасибо за хорошую идею. Этот метод в обоих случаях -1 не возратил, т.е. со стороны сервера все чисто и он честно передает данные в сокет. Только у меня такое чувство, что когда больше двух блоков, появляются проблемы с потоком
Записан
zabivator
Гость
« Ответ #5 : Март 13, 2007, 09:54 »

flush?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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