Russian Qt Forum

Qt => Работа с сетью => Тема начата: moroz от Март 09, 2007, 20:59



Название: Qt4 Server/Client
Отправлено: 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()), то данные можно считать.
Я в шоке. Кто-нибудь уже сталкивался с такой проблемой?
Что я делаю неправильно? Подскажите пожалуйста


Название: Qt4 Server/Client
Отправлено: Mixolap от Март 09, 2007, 21:45
bool QIODevice::waitForBytesWritten ( int msecs )
bool QIODevice::waitForReadyRead ( int msecs )

А если добавить в код использование этих функций?


Название: Qt4 Server/Client
Отправлено: moroz от Март 10, 2007, 12:56
Поставил ожидание на 500мс, результат тот же только медленее  
Но, все равно огромное спасибо


Название: Qt4 Server/Client
Отправлено: Alex03 от Март 10, 2007, 17:06
Для начала поглядите что у Вас возвращает clientSocket->write(block)


Название: Qt4 Server/Client
Отправлено: moroz от Март 10, 2007, 19:34
Спасибо за хорошую идею. Этот метод в обоих случаях -1 не возратил, т.е. со стороны сервера все чисто и он честно передает данные в сокет. Только у меня такое чувство, что когда больше двух блоков, появляются проблемы с потоком


Название: Qt4 Server/Client
Отправлено: zabivator от Март 13, 2007, 09:54
flush?