crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Потеря данных по TCP
Гость_Tigr_*
сообщение 26.11.2010, 12:39
Сообщение #1





Гости








    


С сервера посылается сообщение:
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
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Еще не успели дойти.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Tigr_*
сообщение 26.11.2010, 12:47
Сообщение #3





Гости








    


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

И как с этим бороться. Мне нужен цельный пакет. Необходимо также учитывать, что одновременно могут прийти несколько типов пакетов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 26.11.2010, 12:57
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Ну так в примерах же посмотреть. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Tigr_*
сообщение 27.12.2010, 9:46
Сообщение #5





Гости








    


Единственное толковое решение это добавлять к сообщению его длину. Если клиент получил не все данные, то ждет, пока сервер пришлет еще.
Вот классический пример:
        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;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.6.2019, 11:01