Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Потеря данных по TCP

Автор: Tigr 26.11.2010, 12:39

С сервера посылается сообщение:

QString str;
QByteArray block;
...
block.append(str);
write(block);

длина str=20946
К клиенту принимает:
QByteArray Str;
Str=tcpSocket.readAll();

Длина str=4380. Куда делись 16566 байтов? Или я где-то ошибся?

Автор: BRE 26.11.2010, 12:41

Еще не успели дойти.

Автор: Tigr 26.11.2010, 12:47

Цитата(BRE @ 26.11.2010, 12:41) *
Еще не успели дойти.

И как с этим бороться. Мне нужен цельный пакет. Необходимо также учитывать, что одновременно могут прийти несколько типов пакетов.

Автор: BRE 26.11.2010, 12:57

Ну так в примерах же посмотреть. :)

Автор: Tigr 27.12.2010, 9:46

Единственное толковое решение это добавлять к сообщению его длину. Если клиент получил не все данные, то ждет, пока сервер пришлет еще.
Вот классический пример:

        QDataStream in(tcpSocket);
        in.setVersion(QDataStream::Qt_4_0);

        if (blockSize == 0) {
            if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
                return;

            in >> blockSize;
        }

        if (tcpSocket->bytesAvailable() < blockSize)
            return;

        QString nextFortune;
        in >> nextFortune;

        if (nextFortune == currentFortune) {
            QTimer::singleShot(0, this, SLOT(requestNewFortune()));
            return;
        }

        currentFortune = nextFortune;

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)